1: 简单介绍
logback是由log4j创始人设计的又一个开源日志组件。
logback当前分成三个模块:logback-core,logback-classic和logback-access。
logback-core是其它两个模块的基础模块。
logback-classic是log4j的一个改良版本。
此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。
logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能(用的少)。
logback-classic包含了logback-core,不需要再单独引用了。
2:在maven中引入
<!-- 实现slf4j接口并整合 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.1</version>
</dependency>
3:配置
logback的配置文件都放在/src/main/resource/文件夹下的logback.xml文件中。
其中logback.xml文件就是logback的配置文件。只要将这个文件放置好了之后,系统会自动找到这个配置文件。
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。-->
<!--scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。-->
<!--debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
<configuration debug="false" scan="true" scanPeriod="60 seconds" packagingData="true">
<!--
property:用来定义变量值的标签,<property> 有两个属性,name和value。通过<property>定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
例如使用<property>定义上下文名称,然后在<contentName>设置logger上下文时使用。
-->
<property name="contextName" value="context-name" />
<property name="log_home" value="/tmp" />
<!-- ******************** appender:日志目的地 start ******************** -->
<!-- 标准输出:console -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出:file -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件输出位置-->
<file>${log_home}/logback.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${log_home}/logback.%d{yyyyMMddHHmm}.log</FileNamePattern>
</rollingPolicy>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<!--
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
-->
</appender>
<!-- ******************** appender:日志目的地 end ******************** -->
<!-- ******************** logger:精确配置package或class的level、appender,可以配置0个或多个 end ******************** --><!--
level:日志级别(logger中的level会覆盖root中的,即以logger中为准,不管是否向上传递)
name:包名 或 类的全路径
addtivity:日志信息是否向上(root)传递
-->
<logger name="logback" />
<!--logback.LogbackDemo:类的全路径 -->
<logger name="logback.LogbackDemo" level="warn" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</logger>
<!-- ******************** logger:精确配置package或class日志的level、appender end ******************** -->
<!-- ******************** root:定义日志的level、appender,且最多只能配置一个 start ******************** -->
<!--TRACE < DEBUG < INFO < WARN < ERROR-->
<root level="debug">
<!-- 定义了INFO及以上级别的日志,分别在文件和控制台输出 -->
<level value="debug" />
<appender-ref ref="file" />
<appender-ref ref="console" />
</root>
<!-- ******************** root:定义日志的level、appender,且最多只能配置一个 end ******************** -->
</configuration>
4:测试
//@Controller
//@RequestMapping("/superadmin")
//public class AreaController {
Logger logger=LoggerFactory.getLogger(AreaController.class);
// @Autowired
// private AreaService areaService;
//
// @RequestMapping(value = "/listareas", method = RequestMethod.GET)
// @ResponseBody
// private Map<String, Object> listAreas() {
logger.info("start------------------------------------------------------------------");
// Map<String, Object> modelMap = new HashMap<String, Object>();
// List<Area> list = new ArrayList<Area>();
// try {
// list = areaService.getAreaList();
// modelMap.put("rows",list);
// modelMap.put("total", list.size());
//
// } catch (Exception e) {
// e.printStackTrace();
// modelMap.put("success", false);
// modelMap.put("errMsg", e.toString());
// }
logger.info("end------------------------------------------------------------------");
// return modelMap;
// }
//}
5:输出
1:控制台输出
2018-09-12 00:03:27.435 [http-nio-8080-exec-4] INFO c.o2o.web.superadmin.AreaController - start------------------------------------------------------------------
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@14b176ec] was not registered for synchronization because synchronization is not active
12-Sep-2018 00:03:27.555 信息 [http-nio-8080-exec-4] com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getPoolManager Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 2, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 10000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1hge1609x1jvgk49ilfqiy|251b39df, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge1609x1jvgk49ilfqiy|251b39df, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost:3306/o2o?useUnicode=true&characterEncoding=utf8, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 30, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 10, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@542215f5] will not be managed by Spring
==> Preparing: select area_id,area_name,priority,create_time,last_edit_time from tb_area order by priority desc
==> Parameters:
<== Columns: area_id, area_name, priority, create_time, last_edit_time
<== Row: 3, 东苑, 12, 2017-06-04 19:12:58.0, 2017-06-04 19:12:58.0
<== Row: 4, 南苑, 10, 2017-06-04 19:13:09.0, 2017-06-04 19:13:09.0
<== Row: 5, 西苑, 9, 2017-06-04 19:13:18.0, 2017-06-04 19:13:18.0
<== Row: 6, 北苑, 7, 2017-06-04 19:13:29.0, 2017-06-04 19:13:29.0
<== Total: 4
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@14b176ec]
2018-09-12 00:03:28.136 [http-nio-8080-exec-4] INFO c.o2o.web.superadmin.AreaController - end------------------------------------------------------------------
2:文件输出