JAVA EE之logback

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:文件输出

猜你喜欢

转载自blog.csdn.net/YU_M_K/article/details/82634405