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表中日志数据 |
|