文档章节

日志文件分离配置

trayvon
 trayvon
发布于 2017/06/01 21:57
字数 1134
阅读 37
收藏 0
点赞 0
评论 0

简介

在实际的应用中有很多需要分离日志的需求,比如为了方便监控错误日志就会把错误日志分开,有一些重要的接口需要单独做日志的也需要单独分开。logback和log4j2都能通过配置简单实现日志的分离。log4j2和logback的配置是差不多的,这里就以logback为例介绍一下如何分离日志文件。

有2个重要的抽象一个是Appender,另一个是Logger,Logger是对日志的抽象作用是输出日志,至于怎么输出有实现决定,Appender是对日志输出的位置的抽象,在logback中日志过滤器也被封装到了Appender中。过滤器被添加到Appender中,添加一个或多个过滤器后,可以用任意条件对日志进行过滤。Appender有多个过滤器时,按照配置顺序执行。当然要分离日志,还要了解下面几个概念。

FilterReply:

过滤器的响应方式,过滤器在执行一个过滤的时候会利用FilterReply枚举,这个枚举包含3个值,分别是DENY,NEUTRAL,ACCEPT。 DENY:日志将立即被抛弃不再经过其他过滤器 NEUTRAL:有序列表里的下个过滤器过接着处理日志 ACCEPT:日志会被立即处理,不再经过剩余过滤器。

LevelFilter

级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMatch 和 onMismatch接收或拒绝日志。有以下子节点:

<level>:设置过滤级别

<onMatch>:FilterReply枚举值,用于配置匹配level时的操作

<onMismatch>:FilterReply枚举值,用于配置不匹配level时的操作

ThresholdFilter

临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。 ThresholdFilter和LevelFilter差不多LevelFilter是对指定级别的进行过滤,只是针对一个级别的,而ThresholdFilter是一个阀值,针对多个级别的。可以通过多个LevelFilter来实现ThresholdFilter同样的功能。

实例

下面通过一个简单的实例来展示一下日志分离。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogStart {
    
    private static final Logger logger = LoggerFactory.getLogger(LogStart.class);
    
    public static void main(String[] args) {
        logger.debug("debug log");
        logger.info("info log");
        logger.warn("warn log");
        logger.error("error log");
        ImportantLog.log();
    }

}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ImportantLog {
    
    private static final Logger logger = LoggerFactory.getLogger(ImportantLog.class);
    
    public static void log(){
        logger.debug("debug log");
        logger.info("info log");
        logger.warn("warn log");
        logger.error("error log");
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <property name="LOG_DIR" value="E:/logs" />

    <!-- 控制台日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%5level] %logger{36}[%file:%line]- %msg%n</Pattern>
        </encoder>
    </appender>

    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/base-%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <Pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%5level] %logger{36}[%file:%line] - %msg%n</Pattern>
        </encoder>
    </appender>

    <appender name="ERROR_WARN_FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>warn</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/error-warn-%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <Pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%5level] %logger{36}[%file:%line] - %msg%n</Pattern>
        </encoder>
    </appender>

    <appender name="INFO_FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/info-%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <Pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%5level] %logger{36}[%file:%line] - %msg%n</Pattern>
        </encoder>
    </appender>

    <appender name="IMPORTANT_LOG_FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/important-%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <Pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%5level] %logger{36}[%file:%line] - %msg%n</Pattern>
        </encoder>
    </appender>

    <logger name="org.springframework" level="ERROR"></logger>

    <!-- name:包或者类名 additivity:是否向上级传递打印信息,默认false cn.freemethod.log.ImportantLog:类的全路径 
        可以单独设置一个appender来输出超时的日志 -->
    <logger name="cn.freemethod.log.ImportantLog" level="INFO"
        additivity="false">
        <appender-ref ref="IMPORTANT_LOG_FILE" />
    </logger>

    <root level="DEBUG">
        <!-- <appender-ref ref="FILE" /> -->
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="ERROR_WARN_FILE" />
        <appender-ref ref="INFO_FILE" />
    </root>

</configuration>

上面的配置文件配置了4个Appender,其中CONSOLE输出到控制台的。ERROR_WARN_FILE配置了一个ThresholdFilter只输出warn和error级别的日志。INFO_FILE配置了一个LevelFilter只输出info日志。IMPORTANT_LOG_FILE是为了重要接口单独配置输出文件位置的Appender。提供给name为cn.freemethod.log.ImportantLog的Logger使用。这个Logger的additivity="false"表示这个Logger输出后就不向父级输出了。Logger默认的父级是root,也就是表示如果配置了additivity="false"就不会向root下的Appender输出了。可以把additivity="false"改为additivity="true"试一试效果。

分离日志

© 著作权归作者所有

共有 人打赏支持
trayvon
粉丝 14
博文 118
码字总数 175521
作品 1
程序员
Nginx系列-4.Nginx日志配置及日志切割

Nginx系列-4.Nginx日志配置及日志切割 目录 - Nginx系列 Nginx系列-1.Linux下安装Nginx Nginx系列-2.配置LNMP(Linux、Nginx、MySQL、PHP)架构 Nginx系列-3.配置Nginx虚拟主机 Nginx系列-4....

ngle ⋅ 06/08 ⋅ 0

Nginx系列-9.配置NFS实现Nginx实现动静分离

Nginx系列-9.配置NFS实现Nginx实现动静分离 目录 - Nginx系列 Nginx系列-1.Linux下安装Nginx Nginx系列-2.配置LNMP(Linux、Nginx、MySQL、PHP)架构 Nginx系列-3.配置Nginx虚拟主机 Nginx系...

ngle ⋅ 06/10 ⋅ 0

Nginx系列-8.配置Nginx+Apache实现动静分离

Nginx系列-8.配置Nginx+Apache实现动静分离 目录 - Nginx系列 Nginx系列-1.Linux下安装Nginx Nginx系列-2.配置LNMP(Linux、Nginx、MySQL、PHP)架构 Nginx系列-3.配置Nginx虚拟主机 Nginx系...

ngle ⋅ 06/10 ⋅ 0

mongodb写安全的相关配置

客户端: WriteConcern JOURNALSAFE 日志安全模式,每一次写操作需要等待日志被同步刷新(fsyncdata, msync)到磁盘上,server才会返回给客户端成功写入的响应。 服务端:journalCommitInte...

智深 ⋅ 2013/07/30 ⋅ 0

MySQL主从复制+mysql-proxy读写分离

MySQL主从复制+mysql-proxy读写分离 主从复制的方式有两种:基于日志、基于GTID(全局事务标识符),我们使用基于日志的复制 MySQL主从复制原理(A/B) 1)master讲数据改变记录到二进制日志(...

推荐码发放 ⋅ 04/19 ⋅ 0

Nginx系列-5.配置Nginx的防盗链

Nginx系列-5.配置Nginx的防盗链 目录 - Nginx系列 Nginx系列-1.Linux下安装Nginx Nginx系列-2.配置LNMP(Linux、Nginx、MySQL、PHP)架构 Nginx系列-3.配置Nginx虚拟主机 Nginx系列-4.Nginx日...

ngle ⋅ 06/08 ⋅ 0

Proxy实现MySQL读写分离

使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql...

彭锐 ⋅ 05/31 ⋅ 0

MySQL5.6 读写分离

一:读写分离架构图 二:安装配置MySQL-Proxy 三:测试读写分离 四:添加MySQL-Proxy 为系统服务 1.1读写分离架构图 1.Slave-1不接收写,也不接收读 2.Slave-1有中继日志,也有二进制日志,因...

凡夫俗子_ ⋅ 2015/07/13 ⋅ 0

mysql5.7的主从复制+读写分离

Mysql主从复制与读写分离 目录: 1、mysql主从复制工作原理 2、mysql读写分离原理,使用Amoeba中间代理层实现读写分离 3、在vmware中实现mysql主从复制+读写分离 一、Mysql主从复制的工作原理...

咖啡猫Mr ⋅ 2017/05/25 ⋅ 0

iBase4J/iBase4J

iBase4J项目简介 iBase4J是Java语言的分布式系统架构。 使用Spring整合开源框架。 使用Maven对项目进行模块化管理,提高项目的易开发性、扩展性。 系统包括5个子系统:公共功能、系统管理Ser...

iBase4J ⋅ 2016/04/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java软件工程师简历中项目经验怎么写?

作者:暗灭 链接:https://www.zhihu.com/question/20695310/answer/180691302 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 直接给你贴个我自己的简历...

颖伙虫 ⋅ 20分钟前 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部