log4j-slf4j-@Slf4j配置及案例

log4j配置及案例

参数意义的说明

日志等级

日志分8个等级,从低到高分别是:ALL TRACE DEBUG INFO WARN ERROR FATAL OFF

Log4j建议只使用四个级别,优先级 从高到低分别是: ERROR、WARN、INFO、DEBUG

  1. ALL 是最低等级的,用于打开所有日志记录

  2. TRACE 在线调试。 默认情况下,既不打印到终端也不输出到文件

  3. DEBUG 终端查看、在线调试。默认情况下会打印到终端输出,但是不会归档到日志文件

  4. INFO 报告程序进度和状态信息。一般这种信息都是一过性的,不会大量反复输出

  5. WARN 警告信息。该错误是一过性的、可恢复的,不会影响程序继续运行,程序仍处在正常状态

  6. ERROR 状态错误。该错误发生后程序仍然可以运行,但是极有可能运行在某种非正常的状态下,导致无法完成全部既定的功能

  7. FATAL 为致命错误(会崩溃)。表明程序遇到了致命的错误,必须马上终止运行

  8. OFF 是最高等级的,用于关闭所有日志记录

配置日志信息输出目的地

log4j.appender.appenderName = fully.qualified.name.of.appender.class

  1. org.apache.log4j.ConsoleAppender(控制台)

    • Threshold=DEBUG 指定日志消息的输出最低层次

    • ImmediateFlush=true 默认值是true,意谓着所有的消息都会被立即输出

    • Target=System.err 默认情况下是:System.out,指定输出控制台

  2. org.apache.log4j.FileAppender(文件)

    • Threshold=DEBUF 指定日志消息的输出最低层次
    • ImmediateFlush=true 默认值是true,意谓着所有的消息都会被立即输出
    • File=mylog.txt 指定消息输出到mylog.txt文件
    • Append=false 默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容
  3. org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)

    • Threshold=DEBUF 指定日志消息的输出最低层次

    • ImmediateFlush=true 默认值是true,意谓着所有的消息都会被立即输出

    • File=mylog.txt 指定消息输出到mylog.txt文件

    • Append=false 默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容

    • DatePattern=”.”yyyy-ww 每周滚动一次文件,即每周产生一个新的文件。默认是每天一个新文件,当然也可以指定按月、周、天、时和分。即对应的格式如下:

      "."yyyy-MM: 每月 
      "."yyyy-ww: 每周 
      "."yyyy-MM-dd: 每天 
      "."yyyy-MM-dd-a: 每天两次 
      "."yyyy-MM-dd-HH: 每小时 
      "."yyyy-MM-dd-HH-mm: 每分钟
      
  4. org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)

    • Threshold=DEBUF 指定日志消息的输出最低层次

    • ImmediateFlush=true 默认值是true,意谓着所有的消息都会被立即输出

    • File=mylog.txt 指定消息输出到mylog.txt文件

    • Append=false 默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容

    • MaxFileSize=100KB 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件

    • MaxBackupIndex=2 指定可以产生的滚动文件的最大数

  5. org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

配置日志信息的格式

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

  1. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  2. org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
  3. org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
  4. org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %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这样的多客户多线程的应用中。
%%:输出一个"%“字符。
另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
%20c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
%-20c:指定输出category的名称,最小的长度是20,如果category的名称小于20的话,”-"号表示左对齐。
%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。

文件配置案例

  • 案例 :输出到控制台和一天一个文件

    log4j.rootLogger=DEBUG,A1,R
    #log4j.rootLogger=INFO,A1,R
    # ConsoleAppender 输出
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
    # File 输出 一天一个文件,输出路径可以定制,一般在根路径下
    log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.R.File=blog_log.txt
    log4j.appender.R.MaxFileSize=500KB
    log4j.appender.R.MaxBackupIndex=10
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
    
  • 案例:Log4J配置文件实现了输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能。

    log4j.rootLogger=DEBUG,CONSOLE,A1,im 
    #DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
    log4j.addivity.org.apache=true
    ################### 
    # Console Appender 
    ################### 
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
    log4j.appender.Threshold=DEBUG 
    log4j.appender.CONSOLE.Target=System.out 
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
    log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
    #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
    ##################### 
    # File Appender 
    ##################### 
    log4j.appender.FILE=org.apache.log4j.FileAppender 
    log4j.appender.FILE.File=file.log 
    log4j.appender.FILE.Append=false 
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
    log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
    # Use this layout for LogFactor 5 analysis
    ######################## 
    # Rolling File 
    ######################## 
    log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender 
    log4j.appender.ROLLING_FILE.Threshold=ERROR 
    log4j.appender.ROLLING_FILE.File=rolling.log 
    log4j.appender.ROLLING_FILE.Append=true 
    log4j.appender.ROLLING_FILE.MaxFileSize=10KB 
    log4j.appender.ROLLING_FILE.MaxBackupIndex=1 
    log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout 
    log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
    #################### 
    # Socket Appender 
    #################### 
    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 Facter 5 
    log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout 
    log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
    ######################## 
    # Log Factor 5 Appender 
    ######################## 
    log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender 
    log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
    ######################## 
    # SMTP Appender 
    ####################### 
    log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender 
    log4j.appender.MAIL.Threshold=FATAL 
    log4j.appender.MAIL.BufferSize=10 
    log4j.appender.MAIL.To=******@163.com
    log4j.appender.MAIL.From=******@163.com
    log4j.appender.MAIL.Subject=ErrorLog
    log4j.appender.MAIL.SMTPHost=smtp.163.com
    log4j.appender.MAIL.SMTPPassword=******
    log4j.appender.MAIL.SMTPUsername=******@163.com
    log4j.appender.MAIL.SMTPDebug=true
    log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout 
    log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
    ######################## 
    # JDBC Appender 
    ####################### 
    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 ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') 
    log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout 
    log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
    log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender 
    log4j.appender.A1.File=SampleMessages.log4j 
    log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' 
    log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
    ################### 
    #自定义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@yeqiangwei.com
    log4j.appender.im.layout=org.apache.log4j.PatternLayout 
    log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
    

高级使用

实验目的
把FATAL级错误写入2000NT日志

实验步骤:

​ 输出到2000NT日志

  1. 把Log4j压缩包里的NTEventLogAppender.dll拷到WINNT/SYSTEM32目录下

    // 下载地址
    http://apache.mirrors.lucidnetworks.net/logging/log4j/1.2.17/log4j-1.2.17.zip
    // 官网下载网址
    http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.17/log4j-1.2.17.zip
    // WINNT/SYSTEM32目录
    win10是C:\Windows\System32
    // 64位文件
    NTEventLogAppender.amd64.dll
    
  2. 写配置文件log4j.properties

    # 在2000系统日志输出
    log4j.logger.NTlog=FATAL, A8
    # APPENDER A8
    log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
    log4j.appender.A8.Source=JavaTest
    log4j.appender.A8.layout=org.apache.log4j.PatternLayout
    log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
    
  3. 调用代码:

    // 要和配置文件中设置的名字相同
    Logger logger2 = Logger.getLogger("NTlog"); 
    logger2.debug("debug!!!");
    logger2.info("info!!!");
    logger2.warn("warn!!!");
    logger2.error("error!!!");
    // 只有这个错误才会写入2000日志(关于win10的2000日志查看https://jingyan.baidu.com/article/60ccbceb764b5664cab197c3.html)
    logger2.fatal("fatal!!!");
    
WARN,ERROR,FATAL级错误发送email通知管理员

发送email通知管理员:

  1. 首先下载JavaMail和JAF

    http://java.sun.com/j2ee/ja/javamail/index.html
    http://java.sun.com/beans/glasgow/jaf.html
    

    在项目中引用mail.jar和activation.jar

    <dependency>
    	<groupId>javax.mail</groupId>
    	<artifactId>mail</artifactId>
    	<version>1.4.5</version>
    </dependency>
    <dependency>
    	<groupId>activation</groupId>
    	<artifactId>activation</artifactId>
    	<version>1.0.2</version>
    </dependency>
    
  2. 写配置文件

    # 将日志发送到email
    log4j.logger.MailLog=WARN,A5
    # APPENDER A5
    log4j.appender.A5=org.apache.log4j.net.SMTPAppender
    log4j.appender.A5.BufferSize=5
    log4j.appender.A5.To=******@163.com
    log4j.appender.A5.From=******@163.com
    log4j.appender.A5.Subject=ErrorLog
    log4j.appender.A5.SMTPHost=smtp.163.com
    log4j.appender.A5.SMTPPassword=******
    log4j.appender.A5.SMTPUsername=******@163.com
    log4j.appender.A5.SMTPDebug=true
    log4j.appender.A5.layout=org.apache.log4j.PatternLayout
    log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
    
  3. 调用代码:

    // 把日志发送到mail
    Logger logger3 = Logger.getLogger("MailLog");
    logger3.warn("warn!!!");
    logger3.error("error!!!");
    logger3.fatal("fatal!!!");
    
其他级别的错误直接在后台输出
  1. 写配置文件

    # 在后台输出
    log4j.logger.console=DEBUG, A1
    # APPENDER A1
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
    
  2. 调用代码

    Logger logger1 = Logger.getLogger("console");
    logger1.debug("debug!!!");
    logger1.info("info!!!");
    logger1.warn("warn!!!");
    logger1.error("error!!!");
    logger1.fatal("fatal!!!");
    
示例总和
  • 全部配置文件:log4j.properties
# 在后台输出
log4j.logger.console=DEBUG, A1
# APPENDER A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
# 在2000系统日志输出
log4j.logger.NTlog=FATAL, A8
# APPENDER A8
log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.A8.Source=JavaTest
log4j.appender.A8.layout=org.apache.log4j.PatternLayout
log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
# 将日志发送到email
log4j.logger.MailLog=WARN,A5
#  APPENDER A5
log4j.appender.A5=org.apache.log4j.net.SMTPAppender
log4j.appender.A5.BufferSize=5
log4j.appender.A5.To=******@163.com
log4j.appender.A5.From=******@163.com
log4j.appender.A5.Subject=ErrorLog
log4j.appender.A5.SMTPHost=smtp.163.com
log4j.appender.A5.SMTPPassword=******
log4j.appender.A5.SMTPUsername=******@163.com
log4j.appender.A5.SMTPDebug=true
log4j.appender.A5.layout=org.apache.log4j.PatternLayout
log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
  • 全部代码:Log4jTest.java
/* 
  * 创建日期 2003-11-13 
  */ 
 package edu.bcu.Bean; 
 import org.apache.log4j.*; 
 //import org.apache.log4j.nt.*; 
 //import org.apache.log4j.net.*; 
 /** 
  * @author yanxu 
  */ 
 public class Log4jTest 
 { 
  public static void main(String args[]) 
  { 
   PropertyConfigurator.configure("log4j.properties"); 
   //在后台输出 
   Logger logger1 = Logger.getLogger("console"); 
   logger1.debug("debug!!!"); 
   logger1.info("info!!!"); 
   logger1.warn("warn!!!"); 
   logger1.error("error!!!"); 
   logger1.fatal("fatal!!!");
//在NT系统日志输出 
   Logger logger2 = Logger.getLogger("NTlog"); 
   //NTEventLogAppender nla = new NTEventLogAppender(); 
   logger2.debug("debug!!!"); 
   logger2.info("info!!!"); 
   logger2.warn("warn!!!"); 
   logger2.error("error!!!"); 
   //只有这个错误才会写入2000日志 
   logger2.fatal("fatal!!!");
//把日志发送到mail 
   Logger logger3 = Logger.getLogger("MailLog"); 
   //SMTPAppender sa = new SMTPAppender(); 
   logger3.warn("warn!!!"); 
   logger3.error("error!!!"); 
   logger3.fatal("fatal!!!"); 
  } 
 }
日志框架总结
集成slf4j-log4j到系统
Slf4j是一款日志记录框架,我们的项目中可能会用到很多的日志,比如commons-logging,又或者是log4j等等,那么不同的日志工具提供了不同的日志接口,我们的项目如果想换一个日志框架,可能需要改动许多的代码,这样slf4j就给我们提供了一种便捷的方式。它提供了一种对日志工具更高一层的抽象,只要导入slf4j的包和slf4j和采用日志工具整合的包,我们就可以使用slf4j来记录日志了,不用去考虑具体的日志工具的接口。那么以后如果要改变日志工具,我们就可以直接将要使用日志工具加到我们的项目中,而不需要改动代码。

如果使用Maven来管理,只需要导入如下依赖即可

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.25</version>
</dependency>

配置文件(log4j.properties)

log4j.rootLogger = DEBUG,stdout,D,I,E
#A5,

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss} %l%m%n

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = C:\\Users\\******\\Desktop\\app_debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ uid:%X{uid} ] - [ %p ]  %m%n

log4j.appender.I = org.apache.log4j.DailyRollingFileAppender
log4j.appender.I.File = C:\\Users\\******\\Desktop\\app_info.log
log4j.appender.I.Append = true
log4j.appender.I.Threshold = INFO
log4j.appender.I.layout = org.apache.log4j.PatternLayout
log4j.appender.I.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = C:\\Users\\******\\Desktop\\app_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

########################
# SMTP Appender
#######################
#log4j.appender.A5=org.apache.log4j.net.SMTPAppender
#log4j.appender.A5.Threshold = ERROR
#log4j.appender.A5.BufferSize=10
#log4j.appender.A5.To=******@******.com
#log4j.appender.A5.From=******@163.com
#log4j.appender.A5.Subject=ErrorLog
#log4j.appender.A5.SMTPHost=smtp.163.com
#log4j.appender.A5.SMTPPassword=******
#log4j.appender.A5.SMTPUsername=******@163.com
#log4j.appender.A5.SMTPDebug=true
#log4j.appender.A5.layout=org.apache.log4j.PatternLayout
#log4j.appender.A5.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

调用代码

public class Log4jtest {


    private static Logger logger = LoggerFactory.getLogger(Log4jtest.class);

    public static void main(String args[])
    {
        MDC.put("uid", UUID.randomUUID().toString());

        // slf4j日志打印
        logger.debug("debug!!!");
        logger.info("info!!!");
        logger.warn("warn!!!");
        logger.error("error!!!");
    }
}
@Slf4j 注解打印日志

依赖

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<!-- 需要安装lombok插件 -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.8</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.7.25</version>
</dependency>
<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>mail</artifactId>
	<version>1.4.5</version>
</dependency>
<dependency>
	<groupId>activation</groupId>
	<artifactId>activation</artifactId>
	<version>1.0.2</version>
</dependency>

配置文件(log4j.properties)

log4j.rootLogger = DEBUG,stdout,D,I,E

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss} %l%m%n

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = C:\\Users\\******\\Desktop\\app_debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ uid:%X{uid} ] - [ %p ]  %m%n

log4j.appender.I = org.apache.log4j.DailyRollingFileAppender
log4j.appender.I.File = C:\\Users\\******\\Desktop\\app_info.log
log4j.appender.I.Append = true
log4j.appender.I.Threshold = INFO
log4j.appender.I.layout = org.apache.log4j.PatternLayout
log4j.appender.I.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = C:\\Users\\******\\Desktop\\app_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

调用代码

@Slf4j
public class Log4jtest {


    private static Logger logger = LoggerFactory.getLogger(Log4jtest.class);

    public static void main(String args[])
    {
        MDC.put("uid", UUID.randomUUID().toString());
        // @Slf4j注解进行日志打印
        log.debug("debug!!!");
        log.info("info!!!");
        log.warn("warn!!!");
        log.error("error!!!");

        // slf4j日志打印
        logger.debug("debug!!!");
        logger.info("info!!!");
        logger.warn("warn!!!");
        logger.error("error!!!");
    }
}
日志跟踪(MDC)

高并发环境下,日志输出很容易出现找不到的情况,在传统阻塞模型下,针对每次请求都是一个线程,因此在输出格式的时候,输出线程名就可以实现了,那么跟日志的时候,就可以根据线程的名字进行跟踪。

当然这种跟踪方式有很多的弊端,首先线程是在线程池中的,来来回回也就那么几个线程,所有如果并发量很大,这种方式并不合适。另外对于多机环境,使用线程名的方式也并不靠谱。

为了解决线程名方式带来的问题,可以在当前线程中放置一个变量的形式,而这个变量的值可以是订单号,也可以随机。在日志输出的时候,将这个值输出出来,就可以保证每个线程的每次请求值是相同的。根据这个值就可以跟踪日志了。

这个值的存储可以使用ThreadLocal来存储,但实现还是比较麻烦,而日志又都有这个需求,因此日志框架就给我们提供了这个便捷的操作。MDC!

MDC设置uuid

MDC.put("uid", UUID.randomUUID().toString());

在日志的配置文件中配置

  • 获取MDC值格式:%X{ key }
# %X{uid} 其中uid就是MDC中的key
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ uid:%X{uid} ] - [ %p ]  %m%n
日志的过滤

那上面配置文件中的 I 举例:

log4j.appender.I.filter.F1=org.apache.log4j.varia.LevelRangeFilter
#这里是设置info日志过滤器的最小日志级别和最大日志级别,这样info-log就会过滤调除info以外的其他日志。
log4j.appender.I.filter.F1.LevelMin=INFO
log4j.appender.I.filter.F1.LevelMax=INFO

参考文档

https://blog.csdn.net/king_kgh/article/details/80430002
https://blog.csdn.net/azheng270/article/details/2173430
https://blog.csdn.net/qq_30764991/article/details/80642502

发布了32 篇原创文章 · 获赞 5 · 访问量 2953
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览