精华内容
下载资源
问答
  • log
    千次阅读
    2021-06-18 10:53:14

    已知log(12)7=m,log(12)3=n,试用m,n表示log(28)63=___

    log是任意底数的对数。比如log2 4就是2为底,4的对数(lg是以10为底的对数,ln是以e为底的对数) loga b=lnb\ln a 比如log2 4=ln4\ln 2=2 (你写的log1不是一个完整的数.

    我知道对数的定义,但比如log5 25这类自然是比较好计算的,可是如果是log2。

    你把这些公式记住就行了1、a^log(a)(b)=b 2、log(a)(a)=1 3、log(a)(MN)=log(a)(M)+log(a)(N); 4、log(a)(M÷N)=log(a)(M)-log(a)(N); 5、log(a)(M^n)=nlog(a)(M) 6、log(a).

    请详细列出关于log、lg的计算方法

    1、a^(log(a)(b))=b 2、log(a)(MN)=log(a)(M)+log(a)(N); 3、log(a)(M÷N)=log(a)(M)-log(a)(N); 4、log(a)(M^n)=nlog(a)(M) 推导 1、因为n=log(a)(b),代入则a^n=b,即a^(log(a)(.

    例如log10=1 log100=10 那么log2=? log5=? 请问log后面加数字是怎么计算结.

    log是对数的符号,你所举例应该是以10为底的对数,对数其实就是指数的逆运算,log后面的数字叫真数,真数在指数运算中是值,比如10^2=100,则log100=2,10^3=.

    你好:log的计算及其log的计算方法 log(ab)=loga+lgb log(a/b)=loga-lgb loga+lgb=log(ab) loga-lgb=log(a/b)

    log(2)(0.4)等于多少过程怎么做? 2是在log的右下脚

    log 0.001=log10^-3=-3 log 0.003=log3-3 约为-2.5(log3大约为0.5) log 0.115=log115-3 约为-1(log115大约为2) 其实你可以画对数函数图像!当底数大于1的时候,那么在log.

    计算器上的log就是指常用对数lg 直接按lg3就行了。计算器上也有IN 键 直接按就行了 相反算log2^3这样的东西要麻烦点 需要利用换地公式 log2^3=lg3/log2 在计算器上 按lg3/(.

    SPL=20lg(0.5x10的5次方)=20(-lg2+5lg10)=20(-0.3+5)=94

    ln就是以e为底的log,lna可写成loge a lg就是以10为底的log1.log(c)(a*b)=log(c)a+log(c)b --相当于同底数幂相乘,底数不变“指数相加” log(c)(a/b)=log(c)a/log(c)b --相当于同.

    lg=log10 由于在数学对数计算时,以10为底的对数非常常见,为了书写方便,提高书写效率,就简化为lg,省掉了中间的o和底数10。类似的还有ln,自然对数,是以e=2..

    对数函数的换底公式 一共好像有5 6 条吧 是那几条 现在需要用到

    就一条啊!换底公式 :log(b)a=log(c)a/log(c)b 令y=log(b)a 则a=b^y 两边取以c为底的对数 log(c)a=log(c)b^y=ylog(c)b 所以y=log(b)a=log(c)a/log(c)b

    比如20log30 应该怎么算!!帮忙把计算过程写出来

    什么20Log30啊 少了一个底数吧 对数的定义 a的b次方等于N 则记 logaN=b 当a=10时则简写为lg 当a=e时记为In 这些不要管 只要吧logaN写成a的x次方等于N 再求x就行 还.

    举例:23=8 则:log(2)8=3 其中,2为底数,8为对数,3为指数

    当a>0且a≠1时,m>0,n>0,那么: (1)log(a)(mn)=log(a)(m)+log(a)(n); (2)log(a)(m/n)=log(a)(m)-log(a)(n); (3)log(a)(m^n)=nlog(a)(m) (n∈r) (4)log(a^n)(m.

    一般log2(4)=2、log2(8)=3、log2(16)=4。那么loga(m)=?

    用对数的换底公式,都换成同样的底 loga(m)=log2(m)/log2(a) 再利用对数的性质计算

    用幂级数展开:可以计算2以内的自然对数,再通过对数公式计算2以上的数,如:ln8=3ln2 ln6=ln(4*1.5)=2ln2+ln1.5 通过换底公式,就可以计算任意对数的值。

    计算机上的log都是默认以10为底的对数,因此log100 = 2,log1000 = 3。如果需要计算以非10为底的对数,要使用换底公式,比如想计算以7为底12的对数,在计算器上的.

    希望能详细点,本人现在高二下半年,要好好复习一下,谢谢啦。

    你好!掌握好8个公式就行啦,两个特值loga(1)=0,loga(a)=1,对数恒等式a的loga(n)次方=n,三个运算公式loga(MN)=loga(M)+loga(N),loga(M/N)=loga(M)-loga(N),loga(b的n次方.

    不要基本公式 要高级点的 比如对数的平方 如[LOG(a)(b)]平方

    1对数的概念 如果a(a>0,且a≠1)的b次幂等于N,即ab=N,那么数b叫做以a为底N的. logaab=b. 特别地,以10为底的对数叫常用对数,记作log10N,简记为lgN;以无理数e(.

    log2(16^1-2x)如何化为ln形式?

    利用对数公式,log2(16^1-2x)=ln(16^1-2x)/ln2=1-2xln16/ln2=4*(1-2x)ln2/ln2=4*(1-2x)=-8x+4

    更多相关内容
  • log4j-2.7api+core包

    热门讨论 2017-03-21 10:31:21
    针对struts2漏洞,特上传log4j-core-2.7.jar和log4j-api-2.7.jar等必备工具包,同时将log4j2.xml添加到项目中,否则会有异常。
  • log4j所需的jar包

    热门讨论 2016-07-06 15:29:16
    log4j所需的jar包commons-logging.jar和log4j-1.2.17.jar 日志你会用得到的。
  • log4j-core-2.7.jar

    热门讨论 2016-11-29 16:26:38
    log4j-core-2.7.jar
  • Log4j.properties配置详解【log4j配置文件】

    万次阅读 多人点赞 2022-02-07 16:35:46
    文章目录一、 Log4j简介1.1 Loggers1.2 Appenders1.3 Layouts二、配置详解2.1 配置根Logger:2.2 配置日志信息输出目的地(appender)2.3 配置日志信息的输出格式(Layout)Log4j比较全面的配置输出独立日志文件 ...

    一、 Log4j简介

    Log4j有三个主要的组件:

    Loggers(记录器):日志类别和级别;
    Appenders (输出源):日志要输出的地方;
    Layouts(布局):日志以何种形式输出

    1.1 Loggers

    Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度,明白这一点很重要,Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。

    1.2 Appenders

    禁用和使用日志请求只是Log4j的基本功能,Log4j日志系统还提供许多强大的功能,比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。
    常使用的类如下:

    org.apache.log4j.ConsoleAppender(控制台)
    org.apache.log4j.FileAppender(文件)
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
    

    配置模式:

    log4j.appender.appenderName = className
    log4j.appender.appenderName.Option1 = value1
    …
    log4j.appender.appenderName.OptionN = valueN
    

    1.3 Layouts

    Log4j可以在Appenders的后面附加Layouts来完成这个功能。
    Layouts提供四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。
    常使用的类如下:

    org.apache.log4j.HTMLLayout(以HTML表格形式布局)
    org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
    

    配置模式:

    log4j.appender.appenderName.layout =className
    log4j.appender.appenderName.layout.Option1 = value1
    ...
    log4j.appender.appenderName.layout.OptionN = valueN
    

    二、配置详解

    在实际应用中,要使Log4j在系统中运行须事先设定配置文件。配置文件事实上也就是对Logger、Appender及Layout进行相应设定。
    Log4j支持两种配置文件格式:

    一种是XML格式的文件,
    一种是properties属性文件。
    下面以properties属性文件为例介绍log4j.properties的配置。

    2.1 配置根Logger:

    log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
    log4j.additivity.org.apache=false:表示Logger不会在父Logger的appender里输出,默认为true
    1. level :设定日志记录的最低级别,可设的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别,Log4j建议只使用中间四个级别。通过在这里设定级别,您可以控制应用程序中相应级别的日志信息的开关,比如在这里设定了INFO级别,则应用程序中所有DEBUG级别的日志信息将不会被打印出来。
    2. appenderName:就是指定日志信息要输出到哪里。可以同时指定多个输出目的地,用逗号隔开。
      例如:log4j.rootLogger=INFO,A1,B2,C3

    2.2 配置日志信息输出目的地(appender)

    log4j.appender.appenderName = className
    appenderName:自定义appderName,在log4j.rootLogger设置中使用;
    className:可设值如下:

    org.apache.log4j.ConsoleAppender(控制台)
    org.apache.log4j.FileAppender(文件)
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
    
    1. ConsoleAppender选项
      Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
      ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
      Target=System.err:默认值是System.out。
    2. FileAppender选项
      Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
      ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
      Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
      File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。
    3. DailyRollingFileAppender选项
      Threshold=WARN #指定日志信息的最低输出级别,默认为DEBUG。 ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
      Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
      File=D:/logs/logging.log4j:指定当前消息输出到logging.log4j文件中。
      DatePattern=’.'yyyy-MM:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件名为logging.log4j,前一个月的日志文件名为logging.log4j.yyyy-MM。
      另外,也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:
      '.'yyyy-MM:每月
      '.'yyyy-ww:每周
      '.'yyyy-MM-dd:每天
      '.'yyyy-MM-dd-a:每天两次
      '.'yyyy-MM-dd-HH:每小时
      '.'yyyy-MM-dd-HH-mm:每分钟
    4. RollingFileAppender选项
      Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
      ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
      Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
      File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。
      MaxFileSize=100KB:后缀可以是KB, MB 或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j.1文件中。
      MaxBackupIndex=2:指定可以产生的滚动文件的最大数,例如,设为2则可以产生logging.log4j.1,logging.log4j.2两个滚动文件和一个logging.log4j文件。

    2.3 配置日志信息的输出格式(Layout)

    log4j.appender.appenderName.layout=className
    className:可设值如下:

    org.apache.log4j.HTMLLayout(以HTML表格形式布局)
    org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
    
    1. HTMLLayout选项
      LocationInfo=true:输出java文件名称和行号,默认值是false。
      Title=My Logging: 默认值是Log4J Log Messages。
    2. PatternLayout选项:
      ConversionPattern=%m%n:设定以怎样的格式显示消息。
      格式化符号说明:
      %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
      %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
      %r:输出自应用程序启动到输出该log信息耗费的毫秒数。
      %t:输出产生该日志事件的线程名。
      %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
      %c:输出日志信息所属的类目,通常就是所在类的全名。
      %M:输出产生日志信息的方法名。
      %F:输出日志消息产生时所在的文件名称。
      %L::输出代码中的行号。
      %m::输出代码中指定的具体日志信息。
      %n:输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"。
      %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
      %%:输出一个"%“字符。
      另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
      c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
      2)%-20c:”-"号表示左对齐。
      3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

    Log4j比较全面的配置

    Log4j配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。

    log4j.rootLogger=DEBUG,console,dailyFile,im
    log4j.additivity.org.apache=true
    
    # 控制台(console)
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.Threshold=DEBUG
    log4j.appender.console.ImmediateFlush=true
    log4j.appender.console.Target=System.err
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # 日志文件(logFile)
    log4j.appender.logFile=org.apache.log4j.FileAppender
    log4j.appender.logFile.Threshold=DEBUG
    log4j.appender.logFile.ImmediateFlush=true
    log4j.appender.logFile.Append=true
    log4j.appender.logFile.File=D:/logs/log.log4j
    log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # 回滚文件(rollingFile)
    log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
    log4j.appender.rollingFile.Threshold=DEBUG
    log4j.appender.rollingFile.ImmediateFlush=true
    log4j.appender.rollingFile.Append=true
    log4j.appender.rollingFile.File=D:/logs/log.log4j
    log4j.appender.rollingFile.MaxFileSize=200KB
    log4j.appender.rollingFile.MaxBackupIndex=50
    log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # 定期回滚日志文件(dailyFile)
    log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.dailyFile.Threshold=DEBUG
    log4j.appender.dailyFile.ImmediateFlush=true
    log4j.appender.dailyFile.Append=true
    log4j.appender.dailyFile.File=D:/logs/log.log4j
    log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
    log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # 应用于socket
    log4j.appender.socket=org.apache.log4j.RollingFileAppender
    log4j.appender.socket.RemoteHost=localhost
    log4j.appender.socket.Port=5001
    log4j.appender.socket.LocationInfo=true
    # Set up for Log Factor 5
    log4j.appender.socket.layout=org.apache.log4j.PatternLayout
    log4j.appender.socket.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # Log Factor 5 Appender
    log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
    log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
    # 发送日志到指定邮件
    log4j.appender.mail=org.apache.log4j.net.SMTPAppender
    log4j.appender.mail.Threshold=FATAL
    log4j.appender.mail.BufferSize=10
    log4j.appender.mail.From = xxx@mail.com
    log4j.appender.mail.SMTPHost=mail.com
    log4j.appender.mail.Subject=Log4J Message
    log4j.appender.mail.To= xxx@mail.com
    log4j.appender.mail.layout=org.apache.log4j.PatternLayout
    log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # 应用于数据库
    log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
    log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
    log4j.appender.database.driver=com.mysql.jdbc.Driver
    log4j.appender.database.user=root
    log4j.appender.database.password=
    log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
    log4j.appender.database.layout=org.apache.log4j.PatternLayout
    log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    
    # 自定义Appender
    log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
    log4j.appender.im.host = mail.cybercorlin.net
    log4j.appender.im.username = username
    log4j.appender.im.password = password
    log4j.appender.im.recipient = corlin@cybercorlin.net
    log4j.appender.im.layout=org.apache.log4j.PatternLayout
    log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    

    输出独立日志文件

    log4j的强大功能无可置疑,但实际应用中免不了遇到某个功能需要输出独立的日志文件的情况,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢?其实只要在现有的log4j基础上稍加配置即可轻松实现这一功能。

    常见
    先看一个常见的log4j.properties文件,它是在控制台和myweb.log文件中记录日志:

    log4j.rootLogger=DEBUG, stdout, logfile
     
    log4j.category.org.springframework=ERROR
    log4j.category.org.apache=INFO
     
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
     
    log4j.appender.logfile=org.apache.log4j.RollingFileAppender
    log4j.appender.logfile.File=${myweb.root}/WEB-INF/log/myweb.log
    log4j.appender.logfile.MaxFileSize=512KB
    log4j.appender.logfile.MaxBackupIndex=5
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
    
    

    不同类输出不同文件
    如果想对不同的类输出不同的文件(以cn.com.Test为例),先要在Test.java中定义:

    private static Log logger = LogFactory.getLog(Test.class);
    

    然后在log4j.properties中加入:

    log4j.logger.cn.com.Test= DEBUG, test
    log4j.appender.test=org.apache.log4j.FileAppender
    log4j.appender.test.File=${myweb.root}/WEB-INF/log/test.log
    log4j.appender.test.layout=org.apache.log4j.PatternLayout
    log4j.appender.test.layout.ConversionPattern=%d %p [%c] - %m%n
    
    

    也就是让cn.com.Test中的logger使用log4j.appender.test所做的配置。
    同一类输出多个日志文件
    但是,如果在同一类中需要输出多个日志文件呢?其实道理是一样的,先在Test.java中定义:

    private static Log logger1 = LogFactory.getLog("myTest1");
    private static Log logger2 = LogFactory.getLog("myTest2");
    
    

    然后在log4j.properties中加入:

    log4j.logger.myTest1= DEBUG, test1
    log4j.appender.test1=org.apache.log4j.FileAppender
    log4j.appender.test1.File=${myweb.root}/WEB-INF/log/test1.log
    log4j.appender.test1.layout=org.apache.log4j.PatternLayout
    log4j.appender.test1.layout.ConversionPattern=%d %p [%c] - %m%n
      
    log4j.logger.myTest2= DEBUG, test2
    log4j.appender.test2=org.apache.log4j.FileAppender
    log4j.appender.test2.File=${myweb.root}/WEB-INF/log/test2.log
    log4j.appender.test2.layout=org.apache.log4j.PatternLayout
    log4j.appender.test2.layout.ConversionPattern=%d %p [%c] - %m%n
    

    也就是在用logger时给它一个自定义的名字(如这里的"myTest1"),然后在log4j.properties中做出相应配置即可。别忘了不同日志要使用不同的logger(如输出到test1.log的要用logger1.info(“abc”))。

    还有一个问题,就是这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中呢?别急,这里有个开关:

    log4j.additivity.myTest1 = false
    

    它用来设置是否同时输出到log4j.rootLogger所配置的日志中,设为false就不会输出到其它地方啦!注意这里的"myTest1"是你在程序中给logger起的那个自定义的名字!
    如果你说,我只是不想同时输出这个日志到log4j.rootLogger所配置的logfile中,stdout里我还想同时输出呢!那也好办,把你的

    log4j.logger.myTest1 = DEBUG, test1改为下式就OK啦!
    log4j.logger.myTest1=DEBUG, stdout,  test1
    

    转自链接: https://www.jianshu.com/p/ccafda45bcea

    展开全文
  • c++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog背景spdlog是什么spdlog快速入门常见问题打印行号怎么控制台看不到log同时输出控制台和文件文件按天分割完整代码附录CMakeList.txt关于 ...

    背景

    在最近新入职同事的推荐下,作者在一个小工具中学习和使用了spdlog,且已发布到线上运行,以下是学习记录。

    更新记录

    • 2021.05.14 增加封装spdlog头文件,快速集成到项目
    • 2021.05.14 通过vcpkg编译安装,1秒集成使用,推荐

    spdlog是什么

    Fast C++ logging library
    按照官方介绍,是一个高性能的C++日志组件,支持跨平台,兼容 C++11。原来项目中使用的是log4cxx,我感觉稍微有点笨重,并且很久没有更新了。

    在新项目中,我只需要一款轻量级的日志组件,能:

    • 存文件
    • 按照天数切分

    快速的浏览了spdlog,满足我的需求,于是开搞!

    spdlog快速入门

    githubhttps://github.com/gabime/spdlog

    以下内容来自spdlog的 README

    编译

    CMake手动方式

    $ git clone https://github.com/gabime/spdlog.git
    $ cd spdlog && mkdir build && cd build
    $ cmake .. && make -j
    

    PS:使用cmake来编译,cmake 命令会生成makefile。如果机器上没有cmake,请先安装一下,我的cmake3.14.5macos 10.15

    meki-mac-pro:~ xuyc$ cmake -version
    cmake version 3.14.5
    
    CMake suite maintained and supported by Kitware (kitware.com/cmake).
    

    Vcpkg全自动方式(推荐)

    首先,确保安装了vcpkg,可以参见 Github文档

    1. 安装spdlog包
    $ vcpkg search spdlog # 搜索
    $ vcpkg install spdlog # 下载,编译,VS2017中会自动发现
    
    1. 配置CMake,使用Vcpkg

    附(vcpkg更多install语法):

    # windows 下使用静态库(mt运行时)
    $ vcpkg install spdlog:x86-windows-static-mt
    # windows 下使用静态库(md运行时)
    $ vcpkg install spdlog:x86-windows-static-md 
    

    原生用法

    #include "spdlog/spdlog.h"
    #include "spdlog/sinks/basic_file_sink.h"
    
    int main() 
    {
        spdlog::info("Welcome to spdlog!");
        spdlog::error("Some error message with arg: {}", 1);
        
        spdlog::warn("Easy padding in numbers like {:08d}", 12);
        spdlog::critical("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}", 42);
        spdlog::info("Support for floats {:03.2f}", 1.23456);
        spdlog::info("Positional args are {1} {0}..", "too", "supported");
        spdlog::info("{:<30}", "left aligned");
        
        spdlog::set_level(spdlog::level::debug); // Set global log level to debug
        spdlog::debug("This message should be displayed..");    
        
        // change log pattern
        spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");
        
        // Compile time log levels
        // define SPDLOG_ACTIVE_LEVEL to desired level
        SPDLOG_TRACE("Some trace message with param {}", 42);
        SPDLOG_DEBUG("Some debug message");
        
        // Set the default logger to file logger
        auto file_logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");
        spdlog::set_default_logger(file_logger);            
    }
    

    官方的代码大概知道怎么使用spdlog了,点个赞。但是可能会遇到一些问题,下面笔者遇到问题的记录。

    实战代码

    SpdlogWarper

    1. log.h
    #ifndef _LOG_0B0512CC_B1CC_4483_AF05_1914E7F7D4DA_
    #define _LOG_0B0512CC_B1CC_4483_AF05_1914E7F7D4DA_
    
    #include <string>
    #include <corecrt_io.h>
    
    #ifndef SPDLOG_TRACE_ON
    #define SPDLOG_TRACE_ON
    #endif
    
    #ifndef SPDLOG_DEBUG_ON
    #define SPDLOG_DEBUG_ON
    #endif
    
    #ifdef _WIN32
    #define __FILENAME__ (strrchr(__FILE__, '\\') ? (strrchr(__FILE__, '\\') + 1):__FILE__)
    #else
    #define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__)
    #endif
    
    #include "zim/zim_dll.h"
    #include "spdlog/spdlog.h"
    #include "spdlog/sinks/daily_file_sink.h"
    #include "spdlog/sinks/stdout_color_sinks.h"
    
    namespace zim {
        class ZIM_DLL_API ZLogger {
          public:
            auto GetLogger() {
                return nml_logger;
            }
    
            ZLogger();
            ~ZLogger();
            ZLogger(const ZLogger&) = delete;
            ZLogger& operator=(const ZLogger&) = delete;
    
          private:
            std::shared_ptr<spdlog::logger> nml_logger;
        };
    }
    ZIM_DLL_API zim::ZLogger& GetInstance();
    
    #define SPDLOG_LOGGER_CALL_(level, ...) GetInstance().GetLogger()->log(spdlog::source_loc{__FILE__, __LINE__, SPDLOG_FUNCTION}, level, __VA_ARGS__)
    #define LogTrace(...)  SPDLOG_LOGGER_CALL_(spdlog::level::trace,__VA_ARGS__)
    #define LogDebug(...)  SPDLOG_LOGGER_CALL_(spdlog::level::debug,__VA_ARGS__)
    #define LogInfo(...)   SPDLOG_LOGGER_CALL_(spdlog::level::info,__VA_ARGS__)
    #define LogWarn(...)   SPDLOG_LOGGER_CALL_(spdlog::level::warn,__VA_ARGS__)
    #define LogError(...)  SPDLOG_LOGGER_CALL_(spdlog::level::err,__VA_ARGS__)
    #define LogCritical(...) SPDLOG_LOGGER_CALL_(spdlog::level::critical,__VA_ARGS__)
    #define LogCriticalIf(b, ...)               \
        do {                                  		    \
    			if ((b)) {               			  \
    				 SPDLOG_LOGGER_CALL_(spdlog::level::critical,__VA_ARGS__); \
    			}                                      \
    	} while (0)
    
    #ifdef WIN32
    #define errcode WSAGetLastError()
    #endif
    
    #endif//_LOG_0B0512CC_B1CC_4483_AF05_1914E7F7D4DA_
    
    1. Log.cpp
    #include "pch.h"
    #include "Log.h"
    
    zim::ZLogger& GetInstance() {
        static zim::ZLogger m_instance;
        return m_instance;
    }
    
    namespace zim {
        ZLogger::ZLogger() {
            if (::_access("logs", 0) == -1) {
                ::_mkdir("logs");
            }
    
            //设置为异步日志
            //spdlog::set_async_mode(32768);  // 必须为 2 的幂
            std::vector<spdlog::sink_ptr> sinkList;
    
    #if 1
            auto consoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
            consoleSink->set_level(spdlog::level::debug);
            //consoleSink->set_pattern("[multi_sink_example] [%^%l%$] %v");
            //consoleSink->set_pattern("[%m-%d %H:%M:%S.%e][%^%L%$]  %v");
            consoleSink->set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - <%s>|<%#>|<%!>,%v");
            sinkList.push_back(consoleSink);
    #endif
            auto dailySink = std::make_shared<spdlog::sinks::daily_file_sink_mt>("logs/log.log", 2, 30);
            dailySink->set_level(spdlog::level::debug);
            sinkList.push_back(dailySink);
    
            nml_logger = std::make_shared<spdlog::logger>("both", begin(sinkList), end(sinkList));
            //register it if you need to access it globally
            spdlog::register_logger(nml_logger);
    
            // 设置日志记录级别
    #ifdef _DEBUG
            nml_logger->set_level(spdlog::level::trace);
    #else
            nml_logger->set_level(spdlog::level::info);
    #endif
    
            //设置当出发 err 或更严重的错误时立刻刷新日志到  disk .
            nml_logger->flush_on(spdlog::level::warn);
    
            spdlog::set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - <%s>|<%#>|<%!>,%v");
            spdlog::flush_every(std::chrono::seconds(2));
    
        }
    
        ZLogger::~ZLogger() {
            spdlog::drop_all();
        }
    }
    

    使用

    #include "Log.h"
    
    int main(){
        LogTrace("trach");
        // 和其他日志库最大的区别所在,也是灵魂所在
        // 自动识别类型,避免%d,%s类型错误,输出不了内容或者崩溃
    	LogDebug("cmd_id={},bodyLen={}", 1, 2);
    	LogInfo("user_id={},app_id={},domainId={},ip={},port={}", 222, 222, 222, "127.0.0.1", 8888);
        // log.cpp中是flush on Warn,所以,这一条日志打印后,才刷到文件
    	LogWarn("bad packet");
    	LogError("error");
    	
    	return 0;
    }
    

    常见问题

    打印行号

    // 先设置日志输出格式
    // %s:文件名,my_file.cpp
    // %#:行号,123
    // %!:函数名,my_func
    spdlog::set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - <%s>|<%#>|<%!>,%v");
    
    // 使用宏才会有行号
    SPDLOG_DEBUG("Some debug message");
    
    spdlog::info("Welcome to spdlog!");
    

    具体见:https://github.com/gabime/spdlog/wiki/3.-Custom-formatting

    推荐写法

    #define DEBUG(...) SPDLOG_LOGGER_DEBUG(spdlog::default_logger_raw(), __VA_ARGS__)
    #define LOG(...) SPDLOG_LOGGER_INFO(spdlog::default_logger_raw(), __VA_ARGS__)
    #define WARN(...) SPDLOG_LOGGER_WARN(spdlog::default_logger_raw(), __VA_ARGS__)
    #define ERROR(...) SPDLOG_LOGGER_ERROR(spdlog::default_logger_raw(), __VA_ARGS__)
    
    DEBUG("debug");
    LOG("info");
    

    怎么控制台看不到log

    设置默认logger为控制台即可

    // 设置默认logger,这里是控制台,所以spdlog::info的内容会输出到控制台
    auto console = spdlog::stdout_color_mt("console");
    spdlog::set_default_logger(console);
    

    官方代码

    #include "spdlog/spdlog.h"
    #include "spdlog/sinks/stdout_color_sinks.h"
    void stdout_example()
    {
        // create color multi threaded logger
        auto console = spdlog::stdout_color_mt("console");    
        //auto err_logger = spdlog::stderr_color_mt("stderr");    
        spdlog::get("console")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name)");
    }
    

    同时输出控制台和文件

    1. 先注册
    // 每天2:30 am 新建一个日志文件
    auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
    // 遇到warn flush日志,防止丢失
    logger->flush_on(spdlog::level::warn);
    
    1. 通过宏来同时输出console和文件,注意logger名字和上面的对应。
    // spd 带行号的打印,同时输出console和文件
    #define DEBUG(...) SPDLOG_LOGGER_DEBUG(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_DEBUG(spdlog::get("daily_logger"), __VA_ARGS__)
    #define LOG(...) SPDLOG_LOGGER_INFO(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_INFO(spdlog::get("daily_logger"), __VA_ARGS__)
    #define WARN(...) SPDLOG_LOGGER_WARN(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_WARN(spdlog::get("daily_logger"), __VA_ARGS__)
    #define ERROR(...) SPDLOG_LOGGER_ERROR(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_ERROR(spdlog::get("daily_logger"), __VA_ARGS__)
    

    文件按天分割

    #include "spdlog/sinks/daily_file_sink.h"
    void daily_example()
    {
        // Create a daily logger - a new file is created every day on 2:30am
        auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
    }
    

    停止调试log没有写文件?

    spdlog为了提高性能,降低对磁盘的写操作,通过flush机制来一次性把日志写入到文件里面持久化。所以如果没有恰当的配置,停止调试或者进程崩溃的时候会有日志丢失的问题。

    定时flush到文件:

    //每三秒刷新一次
    spdlog::flush_every(std::chrono::seconds(3));
    

    遇到error级别,立即flush到文件:

    enum level_enum
    {
        trace = SPDLOG_LEVEL_TRACE, // 最低
        debug = SPDLOG_LEVEL_DEBUG,
        info = SPDLOG_LEVEL_INFO,
        warn = SPDLOG_LEVEL_WARN,
        err = SPDLOG_LEVEL_ERROR,
        critical = SPDLOG_LEVEL_CRITICAL, // 最高
        off = SPDLOG_LEVEL_OFF,
        n_levels
    };
    
    auto logger = spdlog::daily_logger_mt("daily_logger", "log/daily.txt", 2, 30);
    // 遇到warn或者更高级别,比如err,critical 立即flush日志,防止丢失
    logger->flush_on(spdlog::level::warn);
    

    完整代码

    // spdlog
    #include "spdlog/spdlog.h"
    #include "spdlog/sinks/rotating_file_sink.h"
    #include "spdlog/sinks/daily_file_sink.h"
    #include "spdlog/sinks/stdout_color_sinks.h"
    #include <iostream>
    #include <memory>
    
    // spd 带行号的打印,同时输出console和文件
    #define DEBUG(...) SPDLOG_LOGGER_DEBUG(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_DEBUG(spdlog::get("daily_logger"), __VA_ARGS__)
    #define LOG(...) SPDLOG_LOGGER_INFO(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_INFO(spdlog::get("daily_logger"), __VA_ARGS__)
    #define WARN(...) SPDLOG_LOGGER_WARN(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_WARN(spdlog::get("daily_logger"), __VA_ARGS__)
    #define ERROR(...) SPDLOG_LOGGER_ERROR(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_ERROR(spdlog::get("daily_logger"), __VA_ARGS__)
    
    int main(int argc, char *argv[]) {
        // 按文件大小
        //auto file_logger = spdlog::rotating_logger_mt("file_log", "log/log.log", 1024 * 1024 * 100, 3);
        // 每天2:30 am 新建一个日志文件
        auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
        // 遇到warn flush日志,防止丢失
        logger->flush_on(spdlog::level::warn);
        //每三秒刷新一次
        spdlog::flush_every(std::chrono::seconds(3));
        
        // Set the default logger to file logger
        auto console = spdlog::stdout_color_mt("console");
        spdlog::set_default_logger(console);
        spdlog::set_level(spdlog::level::debug); // Set global log level to debug
    
        // change log pattern
        // %s:文件名
        // %#:行号
        // %!:函数名
        spdlog::set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - <%s>|<%#>|<%!>,%v");
    
        LOG("test info");
        ERROR("test error");
        
        // Release and close all loggers
        spdlog::drop_all();
    }
    

    控制台输出

    /Users/xuyc/repo/sd_linux/cmake-build-debug/sd_linux
    [2020-04-30 16:14:41.816] [console] [info] [main.cpp:608] test info
    [2020-04-30 16:14:41.816] [console] [error] [main.cpp:609] test error
    
    Process finished with exit code 0
    

    文件
    在这里插入图片描述

    附录

    网上说只需要头文件即可,不过我还是链接了。。。

    CMakeList.txt

    cmake_minimum_required(VERSION 3.15)
    project(sd_linux)
    
    set(CMAKE_CXX_STANDARD 14)
    AUX_SOURCE_DIRECTORY(./ SRC_LIST)
    AUX_SOURCE_DIRECTORY(./jsoncpp SRC_LIST)
    
    // 包含spdlog的头文件
    INCLUDE_DIRECTORIES(./jsoncpp ./spdlog/include)
    // 包含spdlog的动态库目录
    LINK_DIRECTORIES(./ ./spdlog/build)
    
    add_executable(sd_linux ${SRC_LIST})
    
    // 链接spdlog动态库
    TARGET_LINK_LIBRARIES(sd_linux curl iconv spdlog)
    

    关于

    推荐下自己的开源IM,纯Golang编写:

    CoffeeChat:
    https://github.com/xmcy0011/CoffeeChat
    opensource im with server(go) and client(flutter+swift)

    参考了TeamTalk、瓜子IM等知名项目,包含服务端(go)和客户端(flutter),单聊和机器人(小微、图灵、思知)聊天功能已完成,目前正在研发群聊功能,欢迎对golang和跨平台开发flutter技术感兴趣的小伙伴Star加关注。

    ————————————————
    版权声明:本文为CSDN博主「许非」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/xmcy001122/article/details/105665732

    展开全文
  • MySQL的日志 - relay log

    千次阅读 2021-01-13 22:23:47
    文章目录前言relay log的作用如何开启relay log验证relay log开启的效果relay log日志相关参数relay log日志的清除最后 前言 前面介绍了MySQL的binlog日志相关的知识点,接下里这篇文章中,我们来看一下relaylog的...
    微信搜索『coder-home』,或者扫一扫右侧的二维码,关注『程序猿集锦』。
    了解更多干货分享,还有各类视频教程。
    扫描它,带走我。

    前言

    前面介绍了MySQL的binlog日志相关的知识点,接下里这篇文章中,我们来看一下relaylog的相关内容。

    relay-log是记录什么的?MySQL用它做什么?

    relay log的作用

    Relay log,我们翻译成中文,一般叫做中继日志,一般情况下它在MySQL主从同步读写分离集群的从节点才开启。主节点一般不需要这个日志。

    master主节点的binlog传到slave从节点后,被写道relay log里,从节点的slave sql线程从relaylog里读取日志然后应用到slave从节点本地。从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致。

    它的作用可以参考如下图,从图片中可以看出,它是一个中介临时的日志文件,用于存储从master节点同步过来的binlog日志内容,它里面的内容和master节点的binlog日志里面的内容是一致的。然后slave从节点从这个relaylog日志文件中读取数据应用到数据库中,来实现数据的主从复制。
    在这里插入图片描述

    如何开启relay log

    开启relaylog可以通过参数relay_log来配置。在my.cnf配置文件中,增加如下配置就可以开启relaylog。

    [mysqld]
    # 启用中继日志,其中mysql-relay表示日志的文件名称,文件存放在datadir参数指向的目录下面。
    relay-log=mysql-relay
    
    # relaylog的其他选项配置
    relay_log_info_repository=table
    relay_log_recovery=on
    sync_relay_log=1
    sync_relay_log_info=1
    

    配置之后,重启MySQL数据库实例,这样就会在datadir参数所指向的目录下面(如果不修改参数datadir的值,默认为/var/lib/mysql这个目录)生成mysql-relay.00000X的relay日志文件,文件的后缀名称表示日志生成的顺序,从1开始累加。

    如果想自定义日志的路径,可以在这里指定文件的具体路径。例如配置为:relay-log=/data/log/relaylog/myrelay,则会在/data/log/relaylog目录下面,生成myrelay.000001这样的relaylog日志文件。

    验证relay log开启的效果

    如果没有开启relaylog,那么参数relay_log后面是没有任何值的。如果开启了relaylog,那么参数relay_log后面会有对一个的relaylog日志文件的名称,又称之为basename,后缀使用序列号标识。

    下面是一个没有开启relaylog和一个开启了relaylog的对比结果,
    在这里插入图片描述

    开启relaylog后,我们在从节点服务器上的可以查看到具体的relaylog日志文件,其中的index文件是一个索引文件,和binlog中的索引文件一样。如下所示:

    root@slave3:/var/lib/mysql# pwd
    /var/lib/mysql
    root@slave3:/var/lib/mysql# ls -lstr mysql-relay*
    4 -rw-r----- 1 mysql mysql 203 Jan  3 11:20 mysql-relay.000026
    4 -rw-r----- 1 mysql mysql 203 Jan  3 11:20 mysql-relay.000027
    4 -rw-r----- 1 mysql mysql 154 Jan  3 11:20 mysql-relay.000028
    4 -rw-r----- 1 mysql mysql  63 Jan  3 11:20 mysql-relay.index
    root@slave3:/var/lib/mysql# cat mysql-relay.index
    ./mysql-relay.000026
    ./mysql-relay.000027
    ./mysql-relay.000028
    root@slave3:/var/lib/mysql#
    

    relay log日志相关参数

    • max_relay_log_size:relaylog日志文件的最大值,默认为0,表示和binlog日志文件大小一样。如果不为0,表示relaylog日志文件的最大值就是设置的对应的大小,该参数的单位为byte。

    • relay_log:设置的relaylog的日志文件路径和名称。如果不设置路径,只是设置文件名,则路径是在datadir参数所指向的磁盘目录。如果设置了目录,则会把relaylog写在对应的目录下。如果设置了目录,则要注意这个目录需要让MySQL有对应的读写的权限才可以,否则启动MySQL数据库会失败。

    • relay_log_basename:relaylog日志文件的基础名称,就是去掉文件后缀之后的文件名称。

    • relay_log_index:relaylog日志的索引文件,里面记录了所有当前有效的relaylog日志文件列表。可以指定这个索引文件的名称和存储目录,不过我们一般配置它和relaylog在同一目录下。

    • relay_log_info_file:这个文件里面,记录当前正在使用到的relaylog的文件名称和日志文件中的位置偏移量,以及master节点上面的binlog日志偏移量。这个文件的名称为relay-log.info,它的目录和relaylog在同级目录下。

    • relay_log_info_repository:这个参数标识着上面的relay_log_info_file中的信息是记录在磁盘目录上,还是记录在表中。它有两个取值范围,分别是FILE或者TABLE

      • 如果relay_log_info_repository=FILE,会在relaylog同级的磁盘目录下,生成relay-log.info文件,用于记录当前relaylog的日志偏移量和master节点上面的binlog日志偏移量。如下是配置为FILE的时候,relay-log.info日志文件的位置信息和内容信息:

        root@slave3:/var/lib/mysql# pwd
        /var/lib/mysql
        root@slave3:/var/lib/mysql# ls -lstr *relay*
        4 -rw-r----- 1 mysql mysql 343 Jan  4 17:40 mysql-relay.000038
        4 -rw-r----- 1 mysql mysql 203 Jan  4 17:40 mysql-relay.000039
        4 -rw-r----- 1 mysql mysql 320 Jan  4 17:40 mysql-relay.000040
        4 -rw-r----- 1 mysql mysql  84 Jan  4 17:40 worker-relay-log.info.1
        4 -rw-r----- 1 mysql mysql  84 Jan  4 17:40 worker-relay-log.info.2
        4 -rw-r----- 1 mysql mysql  84 Jan  4 17:40 worker-relay-log.info.3
        4 -rw-r----- 1 mysql mysql  84 Jan  4 17:40 worker-relay-log.info.4
        4 -rw-r----- 1 mysql mysql  84 Jan  4 17:40 worker-relay-log.info.5
        4 -rw-r----- 1 mysql mysql  84 Jan  4 17:40 worker-relay-log.info.6
        4 -rw-r----- 1 mysql mysql  63 Jan  4 17:40 mysql-relay.index
        4 -rw-r----- 1 mysql mysql  55 Jan  4 17:40 relay-log.info
        root@slave3:/var/lib/mysql# more relay-log.info
        7
        ./mysql-relay.000038
        320
        mysql-bin.000008
        315
        0
        0
        1
        
        # 当使用逻辑时钟的方式来优化从节点执行relaylog日志速度的时候,会有多个这样的.info文件生成。
        # 逻辑时钟配置为几个,这里就有几个对应的.info文件,后面跟着数字来区分。
        root@slave3:/var/lib/mysql# more worker-relay-log.info.3
        3
        
        0
        
        0
        
        0
        
        0
        0
        64
        
        root@slave3:/var/lib/mysql#
        

        当把relay_log_info_repository的值改为TABLE之后,上面列出来的关于ls -lstr *relay*info*输出的.info结尾的文件都会自动消失不见。

        这里需要注意一个问题:如果想把relay_log_info_repository原先配置的TABLE,想改为FILE,或者原先是FILE,想改为TABLE。除了把my.cnf配置文件中参数relay_log_info_repository值改为想设置的值之外,还需要登录到MySQL的从节点命令行中,使用stop slave的命令停止从节点同步任务,然后再执行set global relay_log_info_repository=xxxx的命令,然后再使用start slave命令启动从节点同步任务,这样才可以切换成功。否则可能会有如下的错误提示:

        2021-01-04T09:34:56.967913Z 0 [Warning] It is not possible to change the type of the relay log repository because there are workers repositories with possible execution gaps. The value of --relay_log_info_repository is altered to one of the found Worker repositories. The gaps have to be sorted out before resuming with the type change.
        
        mysql> set GLOBAL  relay_log_info_repository='file';
        ERROR 3081 (HY000): This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL '' first
        mysql> set GLOBAL  relay_log_info_repository='table';
        ERROR 3081 (HY000): This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL '' first
        mysql> 
        
      • 如果relay_log_info_repository=TABLE,则不会生成relay-log.info文件,信息会记录在mysql.slave_relay_log_info的表中,推荐使用这种方式,方便查看主节点和从节点的日志偏移量信息。如下所示:

        mysql> select * from mysql.slave_relay_log_info\G
        *************************** 1. row ***************************
          Number_of_lines: 7
           Relay_log_name: ./mysql-relay.000026
            Relay_log_pos: 4
          Master_log_name: mysql-bin.000007
           Master_log_pos: 2235
                Sql_delay: 0
        Number_of_workers: 6
                       Id: 1
             Channel_name:
        1 row in set (0.01 sec)
        
    • relay_log_purge:开启或关闭在不需要的时候自动删除中转日志,默认开启。这是个全局变量,可以通过SET GLOBAL relay_log_purge=0 进行动态的设置。

    • relay_log_recovery:假如slave从库宕机后,很有可能导致relay log日志文件损坏,导致一部分中继日志没有处理。如果参数设置为开启ON的状态,则自动放弃所有未执行的relay log,并且重新从master上获取对应的日志,这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为ON时,可在slave从库上开启这个功能,建议将relay_log_recovery设置为ON

    • relay_log_space_limit:防止中继日志写满磁盘,这里设置中继日志最大限额。但此设置存在主库崩溃,从库中继日志不全的情况,不到万不得已,不推荐使用。设置为0表示不启用该功能。该参数的默认值就是0。

    • sync_relay_log:这个参数和sync_binlog是一样的,它觉得了什么时候把从主节点同步过来的relaylog的内容刷新到磁盘中。

      如果sync_relay_log = 0,从主节点同步过来的relaylog日志内容并不会马上被刷新到磁盘中,而是由操作系统自己决定什么时候将同步过来的内容刷新到磁盘。

      如果sync_relay_log = N > 0,此时MySQL会在每间隔N个事件后,将relaylog的内容同步刷新到磁盘。此时有可能会导致丢失事务内容。

      建议是设置为1,slave的I/O线程每次接收到master发送过来的binlog日志都要写入系统缓冲区,然后刷入relay log中继日志里,这样是最安全的,因为在崩溃的时候,你最多会丢失一个事务,但会造成磁盘的大量I/O。

      详细请参考:https://dev.mysql.com/doc/refman/5.7/en/replication-options-replica.html#sysvar_sync_relay_log

    • sync_relay_log_info:

      sync_relay_log_info = 0的情况下:

      • 如果relay_log_info_repository=FILE, 表示relaylog日志偏移量记录在日志文件relay-log.info中,由操作系统自己决定什么时候把relaylog日志的偏移量刷新到 relay-log.info 文件中。
      • 如果 relay_log_info_repository=TABLE,表示relaylog日志偏移量记录在表mysql.slave_relay_log_info里面,如果这个表支持事务,例如是innodb存储引擎的表,那么表mysql.slave_relay_log_info中的数据内容会在每一个事务结束之后都会被更新。
      • 如果 relay_log_info_repository=TABLE,表示relaylog日志偏移量记录在表mysql.slave_relay_log_info里面,如果这个表不支持事务,例如是myisam存储引擎的表,那么表mysql.slave_relay_log_info里面的信息永远不会被更新。

      sync_relay_log_info = N > 0的情况下:

      • 如果relay_log_info_repository=FILE, 表示relaylog日志偏移量记录在日志文件relay-log.info中,会每隔N个事务把relaylog日志的偏移量刷新到 relay-log.info 文件中。
      • 如果 relay_log_info_repository=TABLE,表示relaylog日志偏移量记录在表mysql.slave_relay_log_info里面,如果这个表支持事务,例如是innodb存储引擎的表,那么表mysql.slave_relay_log_info中的数据内容会在每一个事务结束之后都会被更新。
      • 如果 relay_log_info_repository=TABLE,表示relaylog日志偏移量记录在表mysql.slave_relay_log_info里面,如果这个表不支持事务,例如是myisam存储引擎的表,那么表mysql.slave_relay_log_info里面的信息会每间N个事件更新一次。

      推荐使用relay_log_info_repository=TABLE,并且表mysql.slave_relay_log_infoinnodb引擎表,这样的配置。这样的配置此时参数sync_relay_log_info的配置就不起作用了。

      详细请参考:https://dev.mysql.com/doc/refman/5.7/en/replication-options-replica.html#sysvar_sync_relay_log_info

    relay log日志的清除

    relaylog的删除,一般情况下不需要我们手动的去做。因为在MySQL的slave从节点上,当SQL集成读取完对应的relaylog日志之后,这个relaylog就被删除了,不需要我们手动去删除。

    当我们执行reset slave或者reset slave all命令的时候,它就会重新生成一个新的relaylog日志文件,文件名称按照序号有序的递增。

    最后

    relaylog的介绍就到这里了,后面我会分享redo log重做日志的相关内容,敬请期待。

    微信搜索『coder-home』,或者扫一扫右侧的二维码,关注『程序猿集锦』。
    了解更多干货分享,还有各类视频教程。
    扫描它,带走我。
    展开全文
  • log4j与log4j2性能对比及log4j升级至log4j2方案

    万次阅读 多人点赞 2019-06-16 11:03:53
    1.前言 之前某个服务在压测环境中出现了问题,分析之后得知是log4jLogger对象争用厉害,很多线程阻塞在此。...关于log4j与log4j2的性能对比文章有很多,本文不过多描述,给出几张结论图及原文链接,作为参考...
  • Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory 需要jar log4j-1.2.16.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar
  • ###一句话总结issue###如果你使用的是 Log4j 1.x、Logback 或者其他日志框架,这次就可以幸免于难。如果你使用Spring Boot`默认日志`,也是没有问题的,因为默认是`Commons Logging`。 ###一句话solution###升级...
  • log4j2 的使用【超详细图文】

    万次阅读 多人点赞 2020-12-06 16:11:03
    log4j2 的使用 Apache Log4j2 是对Log4j 的升级版本,参考了logback 的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有: 异常处理,在logback中,Appender中的异常不会被应用感知到,但是...
  • java中log日志的使用(完全版)

    万次阅读 2021-03-04 08:48:40
    Commons_logging包Apache通用日志包他为Log4JLogger;NoOpLog;LogKitLogger;Jdk14Logger;AvalonLogger提供了一共通用的接口进行调用,使得在使用各种不同的第三方日志包时变得非常简单。SimpleLog:是commons_...
  • Log4j.properties配置详解

    万次阅读 多人点赞 2020-04-02 15:19:25
    1.1 新建一个Java工程,导入包log4j-1.2.17.jar,整个工程最终目录如下 1.2 src同级创建并设置log4j.properties ### 设置### log4j.rootLogger = debug,stdout,D,E ### 输出信息到控制抬 ### log4j.appender....
  • Spring Boot配置log4j记录日志

    万次阅读 多人点赞 2019-02-18 16:57:18
    转载请注明出处:Spring Boot配置log4j记录日志 我们在老的项目框架ssh,springMVC中都使用过log4j日志模块。 例如:java日志功能log4j模块的使用方法 Spring Boot框架也能很好的快速集成log4j,本篇文章记录如何在...
  • log4j配置详解(非常详细)

    千次阅读 2021-01-27 14:08:14
    log4j配置详解(非常详细) Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。 配置文件 Log4J...
  • spdlog学习笔记

    万次阅读 多人点赞 2019-04-18 17:17:15
    说明:所有内容翻译自spdlog的wiki,受英语水平所限,有所错误或失真在所难免,如果您有更好的建议,请在博文下留言。 线程安全 spdlog:: 命名空间下的是线程安全的,当loggers在不同的线程同时执行时,下述函数不...
  • apache log4j漏洞复现

    万次阅读 多人点赞 2021-12-10 09:40:21
    Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)利用条件利用2. CVE-2019-17571利用条件利用3. apache log4j rce利用条件环境搭建利用 1. Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) ...
  • log4j.properties配置文件详解

    千次阅读 2022-02-21 16:49:07
    Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。 1. 配置文件 Log4J配置文件的基本格式...
  • 科学计算机计算对数log的方法:情况一:计算底为10的log(10)即lg:一般的计算器都默认log的底数为10,因此计算这类对数时,直接点击计算机的“log”键,再打上数字即可。例如,求“lg(10)”可在科学计算器中按下:...
  • Log4j 严重漏洞修最新修复方案参考

    千次阅读 2021-12-21 19:24:32
    CVE-2021-44228,原理上是 log4j-core 代码中的 JNDI 注入漏洞。这个漏洞可以直接导致服务器被入侵,而且由于“日志”场景的特性,攻击数据可以多层传导,甚至可以威胁到纯内网的服务器。log4j 作为 Java 开发的基础...
  • Log4j使用教程

    万次阅读 2021-08-16 20:11:47
    日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。在apache网站:jakarta.apache.org/log4j可以免费下载到Log4j最新版本的软件包。Maven工程中依赖如下: <...
  • Log4j 漏洞到底是怎么一回事?Log4j 2.15.0 也不靠谱了...
  • graylog+kafka+zookeeper(单机测试及源码),组件部署,查找问题分析(一)
  • debug——生成log

    千次阅读 2021-05-31 16:46:28
    1、生成log的简单方式 import logging # logging是多线程运行的,能确保所有logging输出顺序是对的,但不能确保logging与print的输出顺序是对的 print('this a print log') # log信息保存在demo.log中 # w写入模式...
  • Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式。 文章目录同步日志混合同步和异步日志异步日志(性能最好,推荐使用) 同步日志 所谓同步...
  • MySQL回滚日志(undo log)总结

    万次阅读 多人点赞 2021-06-13 08:47:03
    undo log是mysql中比较重要的事务日志之一,顾名思义,undo log是一种用于撤销回退的日志,在事务没提交之前,MySQL会先记录更新前的数据到 undo log日志文件里面,当事务回滚时或者数据库崩溃时,可以利用 undo log...
  • Log4j2漏洞复现

    千次阅读 2022-08-12 15:24:19
    Apache Log4j2是 Apache软件基金会下的一个开源的基于 Java 的日志记录工具。Log4j2 是一个 Log4j 1.x 的重写,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。由于其优异的性能而...
  • R语言log函数实战(loglog2、log10)

    千次阅读 2021-09-07 14:34:08
    R语言log函数实战(loglog2、log10) 目录 R语言log函数实战(loglog2、log10) #基本语法 #log函数应用于数值变量 #自定义log函数的底数 #log2函数 #log10函数 #log函数应用于向量 #基本语法 ...
  • 最详细的Log4J使用教程

    万次阅读 多人点赞 2018-03-11 17:17:55
    地址:http://www.codeceo.com/log4j-usage.html ...在apache网站:jakarta.apache.org/log4j可以免费下载到Log4j最新版本的软件包。 一、入门实例 1.新建一个JAva工程,导入包log4j-1.2.17.jar,整个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,854,483
精华内容 2,341,793
关键字:

log