关于Log4J记录日志格式加载以及匹配源码解读

之前看了Log4J是如何匹配记录的log等级的的源码,log4J的配置项有很多,要一一的去进行查看log4J是如何应用这些配置项的,今天这篇记录下log4J是如何匹配记录的格式,先上配置,这里展示的是我自己重写的

  <appender name="DailyRollingFile" class="com.log.jlogstash.logger.DailySizeRollingFileAppender">
        <param name="File" value="${LogDir}/${svr}/${Seq}"/>
        <param name="DirectoryPattern" value="yyyyMMdd"/>
        <param name="DatePattern" value="'_'yyyyMMddHH'_%02d.log'"/>
        <param name="Append" value="true" />
        <param name="MaxFileSize" value="20MB" />
        <param name="MaxBackupIndex" value="50" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m%n" />
        </layout>
    </appender>

实际如果不使用自己重写的的话,可以直接使用log4J提供的appender,如下,具体可以根据自身情况选择

<appender name="DailyRollingFile" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="${LogDir}/${svr}/${Seq}"/>
        <param name="DirectoryPattern" value="yyyyMMdd"/>
        <param name="DatePattern" value="'_'yyyyMMddHH'_%02d.log'"/>
        <param name="Append" value="true" />
        <param name="MaxFileSize" value="20MB" />
        <param name="MaxBackupIndex" value="50" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m%n" />
        </layout>
    </appender>

关于记录log的格式,配置在appender的layout参数中,具体的含义可以自行在网上搜索,我每次用的时候都是去找,因为记不住

那Log4J是怎么怎么使用这个Layout参数的勒?围绕这个问题,还是得回到LogManager的加载过程

在LogManager的加载过程中,会解析文件中的appender,会调用DomConfigurator这个类下的parseAppender的方法将配置文件中的参数加载到appender里面,如下源码

protected Appender parseAppender(Element appenderElement) {
        String className = this.subst(appenderElement.getAttribute("class"));
        LogLog.debug("Class name: [" + className + ']');

        try {
            Object instance = Loader.loadClass(className).newInstance();
            Appender appender = (Appender)instance;
            PropertySetter propSetter = new PropertySetter(appender);
            appender.setName(this.subst(appenderElement.getAttribute("name")));
            NodeList children = appenderElement.getChildNodes();
            int length = children.getLength();

            for(int loop = 0; loop < length; ++loop) {
                Node currentNode = children.item(loop);
                if (currentNode.getNodeType() == 1) {
                    Element currentElement = (Element)currentNode;
                    if (currentElement.getTagName().equals("param")) {
                        this.setParameter(currentElement, propSetter);
                    } else if (currentElement.getTagName().equals("layout")) {
                        appender.setLayout(this.parseLayout(currentElement));
                    } else if (currentElement.getTagName().equals("filter")) {
                        this.parseFilters(currentElement, appender);
                    } else if (currentElement.getTagName().equals("errorHandler")) {
                        this.parseErrorHandler(currentElement, appender);
                    } else if (currentElement.getTagName().equals("appender-ref")) {
                        String refName = this.subst(currentElement.getAttribute("ref"));
                        if (appender instanceof AppenderAttachable) {
                            AppenderAttachable aa = (AppenderAttachable)appender;
                            LogLog.debug("Attaching appender named [" + refName + "] to appender named
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值