分享

spring中logback日志详细配置

 我心永恒lz 2017-04-16
1. pom中添加依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.4</version>
</dependency>

2. web.xml添加LogbackConfigListener
<context-param>
  <param-name>webAppRootKey</param-name>
  <param-value>demo.root</param-value>
  </context-param>
  <context-param>
  <param-name>logbackConfigLocation</param-name>
  <param-value>classpath:config/logback.xml</param-value>
  </context-param>
  <!-- This listener should be registered before ContextLoaderListener in web.xml, 
  when using custom Logback initialization. -->
  <listener>
  <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
  </listener>

3. 配置文件logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- debug:默认为false,设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。
scan:配置文件如果发生改变,将会重新加载,默认值为true。
scanPeriod:检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位时毫秒,
当scan为true时,这个属性生效,默认时间间隔为1min。
 -->
<configuration debug="true" scan="false" scanPeriod="1 hour">
<!-- 日志上下文名称 -->
<contextName>logback</contextName>
<!-- 设置参数,通过${paramName}获取参数值 -->
<property name="log.path" value="E:/logs/demo"></property>
<appender name="stdOut" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
<!-- 日志输出拦截器,控制台只打印INFO级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 文件日志Appender。可以配置日志文件的名称、日志的输出格式、滚动策略等。
滚动策略:配置日志文件名称,最多可以保持多少个历史日志文件。
当文件大小超过配置大小时,触发滚动策略。
如:日志文件大小超过20M(默认10M),触发滚动策略。 -->
    <appender name="daoFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${log.path}/dao.log</file>
        <encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/dao.%d{yyyyMMddHH}.%i.log.zip</fileNamePattern>
            <maxHistory>30</maxHistory>
<maxFileSize>20MB</maxFileSize>
         </rollingPolicy>
</appender>
<appender name="jobFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${log.path}/job.log</file>
        <encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/job.%d{yyyyMMddHH}.%i.log.zip</fileNamePattern>
            <maxHistory>30</maxHistory>
<maxFileSize>20MB</maxFileSize>
        </rollingPolicy>
</appender>
<appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${log.path}/demo.log</file>
        <encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/demo.%d{yyyyMMddHH}.%i.log.zip</fileNamePattern>
            <maxHistory>30</maxHistory>
<maxFileSize>20MB</maxFileSize>
        </rollingPolicy>
</appender>
<!--日志异步到数据库 -->
<appender name="dbAppender" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>
jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8
</url>
<user>root</user>
<password>root</password>
</connectionSource>
</appender>
<!-- 不同包下的日志放在不同的文件中 -->
<logger name="com.wxyh.demo.dao" level="INFO" additivity="false">
<appender-ref ref="daoFileAppender"/>
</logger>
<logger name="com.wxyh.demo.web.job" level="INFO" additivity="false">
<appender-ref ref="jobFileAppender"/>
<appender-ref ref="dbAppender"/>
</logger>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="stdOut"/>
<appender-ref ref="fileAppender"/>
</root>
</configuration>

4. 建DBAppender需要的表

BEGIN;

DROP TABLE IF EXISTS logging_event_property;

DROP TABLE IF EXISTS logging_event_exception;

DROP TABLE IF EXISTS logging_event;

COMMIT; 

BEGIN; 

CREATE TABLE logging_event

  (event_id         BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,

    caller_filename   VARCHAR(254) NOT NULL,

    caller_class      VARCHAR(254) NOT NULL,

    caller_method     VARCHAR(254) NOT NULL,

    caller_line       CHAR(4) NOT NULL,

    timestmp         BIGINT NOT NULL,

    formatted_message  TEXT NOT NULL,

    logger_name       VARCHAR(254) NOT NULL,

    level_string      VARCHAR(254) NOT NULL,

    thread_name       VARCHAR(254),

    reference_flag    SMALLINT,

    arg0              VARCHAR(254),

    arg1              VARCHAR(254),

    arg2              VARCHAR(254),

    arg3              VARCHAR(254)

  );

COMMIT; 

BEGIN;

CREATE TABLE logging_event_property

  (event_id          BIGINT NOT NULL,

    mapped_key        VARCHAR(254) NOT NULL,

    mapped_value      TEXT,

    PRIMARY KEY(event_id, mapped_key),

    FOREIGN KEY (event_id) REFERENCES logging_event(event_id)

  );

COMMIT; 

BEGIN;

CREATE TABLE logging_event_exception

  (event_id         BIGINT NOT NULL,

    i                SMALLINT NOT NULL,

    trace_line       VARCHAR(254) NOT NULL,

    PRIMARY KEY(event_id, i),

    FOREIGN KEY (event_id) REFERENCES logging_event(event_id)

  );

COMMIT;


5. 测试用例
@Component
public class JobExample4SpringTask {
private final Logger logger = LoggerFactory.getLogger("com.wxyh.demo.web.job");
private final AtomicInteger ai = new AtomicInteger(0);
@Scheduled(cron = "0/5 * * * * ?")
public void execute() {
int execBath = ai.incrementAndGet();
logger.debug("执行JobExample4SpringTask, 批次={}", execBath);
logger.info("执行JobExample4SpringTask, 批次={}", execBath);
logger.warn("执行JobExample4SpringTask, 批次={}", execBath);
logger.error("执行JobExample4SpringTask, 批次={}", execBath);
}
}

6. 结果
6.1 job.log日志文件 
2017-04-16 17:52:40.001 [jobScheduler-1] INFO  com.wxyh.demo.web.job - 执行JobExample4SpringTask, 批次=1
2017-04-16 17:52:40.048 [jobScheduler-1] WARN  com.wxyh.demo.web.job - 执行JobExample4SpringTask, 批次=1
2017-04-16 17:52:40.057 [jobScheduler-1] ERROR com.wxyh.demo.web.job - 执行JobExample4SpringTask, 批次=1
2017-04-16 17:52:45.001 [jobScheduler-1] INFO  com.wxyh.demo.web.job - 执行JobExample4SpringTask, 批次=2
2017-04-16 17:52:45.022 [jobScheduler-1] WARN  com.wxyh.demo.web.job - 执行JobExample4SpringTask, 批次=2
2017-04-16 17:52:45.038 [jobScheduler-1] ERROR com.wxyh.demo.web.job - 执行JobExample4SpringTask, 批次=2 
6.2 logging_event表中日志数据
 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多