Spring Mvc那点事---(41)SSM使用log4j2记录日志

时间:2021-05-09 21:53:32

引子

   现在项目开发中,越来越多使用log4j2来记录日志,log4j2比log4更方便,更快捷,效率更高,更加灵活。使用log4j2需要引入 log4j-api-xxx.jar和log4j-core-xxxx.jar. 今天研究了下使用方法,包括怎样使用log4j2记录日志和把日志信息写入数据库。

准备

    log4j2写入日志包括的级别有如下几种,优先级别为 trace<debug<info<warn<error<fatal, 如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来
    文件名称约定为 log4j2.xml,文件必须放在src目录下面,系统运行的时候,会自动去src目录下加载log4j2.xml文件.
   log4j2.xml文件内容包括 Appender和logger,  根节点configuration下有两个子节点:appenders和loggers(可定义多个appender和logger了)
  Appender表示输出目的地,不同的输出位置都可以被称为Appender,例如,appender可以是console,文件,远程socket服务器,
  一个logger可以绑定多个不同appender
Appenders中的标签内容含义如下
1,ConsoleAppender
输出结果到System.out或是System.err。
2,FileAppender
输出结果到指定文件,同时可以指定输出数据的格式。append=“false”指定不追加到文件末尾
3,RollingFileAppender
自动追加日志信息到文件中,直至文件达到预定的大小,然后自动重新生成另外一个文件来记录之后的日志。


appender常用配置:
           name:appender的名称
    fileName:输出文件和名称
    append:是否追加,true表示追加内容到所在的日志,false表示每次都覆盖
    filePattern:表示当日志到达指定的大小或者时间,产生新日志时,旧日志的命名路径
    PatternLayout:指定输出日志的格式,具体代表的意思见前面的博客中
    Policies:策略,表示日志什么时候应该产生新日志,可以有时间策略和大小策略等
    ThresholdFilter :过滤器,log4j2中有很多的filter
Logger常用配置
   additivity设置为true会被打印多次,加入一个类ProductServiceImpl.class同时满足logger,又满足root,在输出的时候就会输出两次


用法

引入jar包
    <dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
log4j2.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Appenders>
<Console name="Console" target="SYSTEM_OUT" ignoreExceptions="false">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %M %-5level %logger{36} - %msg%n" />
</Console>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app-%d{MM-dd-yyyy}.log.gz" ignoreExceptions="false">
<PatternLayout>
<Pattern>%d %p %c [%t] %m%n</Pattern>
</PatternLayout>
<TimeBasedTriggeringPolicy />
</RollingFile>
/>
</Async>
</Appenders>
<Loggers>
<Logger name="org.supersoft.erp" level="debug" additivity="false">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
</Logger>
<Root level="debug">
<appender-ref ref="Console"/>
</Root>
</Loggers>
</Configuration>
在程序中我们有两种方式可以使用
1.private static final Logger logger = LoggerFactory.getLogger(LogTest.class);
    上面这种方式会根据类名获取logger,  logger的使用是有命名规则的,与java的包类似,例如 org.supersoft.erp.service.impl. LogTest的父级是 org.supersoft.erp
  最先找到是和类名匹配的名称的logger,如果找不到,就使用包含匹配名称的, LogTest.class的全名是 org.supersoft.erp.service.impl. LogTest,如果没有匹配的,就使用上级名称为org.supersoft.erp的logger

2.private static final Logger logger = LoggerFactory.getLogger("org.supersoft.erp");
    上面这种使用方法直接从log4j2.xml中找名称为 org.supersoft.erp为logger