• log4j2配置固定内容(IP等)


    需求: 记录日志时须要添加服务IP和服务编号(由UUID生成),便于运维人员在查看日志时定位到哪台服务器上的哪一个服务。html

    基于spring web项目java

    一、 log4j2.xml文件web

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="error" monitorInterval="30">
    
        <Properties>
            <!-- 配置日志文件输出目录 -->
            <Property name="LOG_HOME">/home/logs</Property>
        </Properties>
        <Appenders>
            <Console name="CONSOLE" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{1.}:%L - IP:%X{ip}&ID:%X{UUID} %msg%xEx%n" />
            </Console>
            <!-- 按天第天备份一个日志 -->
            <RollingFile name="FILE" fileName="${LOG_HOME}/demo.log" filePattern="${LOG_HOME}/demo.log.%d{yyyy-MM-dd}.log.gz">
                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{1.}:%L - %X{ip}&ID:%X{UUID} %msg%xEx%n" />
                <Policies>
                    <!-- 每24小时更新一次 -->
                    <TimeBasedTriggeringPolicy modulate="true" interval="24" />
                    <SizeBasedTriggeringPolicy size="128KB" />
                </Policies>
                <!-- 最多备份10个 -->
                <DefaultRolloverStrategy max="10" />
            </RollingFile>
        </Appenders>
        <Loggers>
    
            <!--<Logger name="com.mosen" level="info">-->
                <!--<AppenderRef ref="FILE" />-->
            <!--</Logger>-->
    
            <Root level="info">
                <AppenderRef ref="CONSOLE" />
                <AppenderRef ref="FILE"></AppenderRef>
            </Root>
        </Loggers>
    </Configuration>
    
     

    pattern格式配置
    %d{yyyy-MM-dd HH:mm:ss.SSS} “d”, “date” 时间格式
    %-5level “p”, “level” 输出日志级别,-5表示左对齐而且固定输出5个字符,若是不足在右边补0
    %class{1.} “C”, “class” 类名,包名只有1位
    %C{3} 获取类名前3级目录(包含类名)
    %L “L”, “line” 输出行号
    %M “M”, “method” 输出所在方法名
    %m “m”, “msg”, “message” 日志文本
    %xEx “xEx”, “xThrowable”, “xException” ExtendedThrowablePatternConverter
    “ex”, “throwable”, “exception” ThrowablePatternConverter
    “rEx”, “rThrowable”, “rException” RootThrowablePatternConverter
    %n 换行spring

    其余占位符有(部分):
    %l “l”, “location” 输出语句所在的行数, 包括类名、方法名、文件名、行数 例如:hahaha.Log4j2Test.main(Log4j2Test.java:15)
    %T “T”, “tid”, “threadId” 输出线程ID
    %t “t”, “tn”, “thread”, “threadName” 输出当前线程名称
    %tp “tp”, “threadPriority” 输出线程权级
    %F “F”, “file” 输出所在的类文件名,如Log4j2Test.java
    %logger “c”, “logger” 输出logger名称,LogManager.getLogger(Log4j2Test.class);中的名称,此处是hahaha.Log4j2Test
    %N “N”, “nano” 纳秒
    %sn “sn”, “sequenceNumber” 日志计数(全局)
    %u “u”, “uuid” UUID(全局)
    %X{ip} “X”, “mdc”, “MDC” MDC方式获取ip(等同于 %MDC{ip} 和 %mdc{ip} )
    %x “x”, “NDC” NDC方式apache

    二、 过滤器类
    log4j2中用ThreadContext代替MDC服务器

    package demo;
    
    import org.apache.logging.log4j.ThreadContext;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import java.io.IOException;
    
    public class ThreadContextFilter implements Filter {
    
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            try {
                ThreadContext.put("UUID", StaticUUID.ID);    //StaticUUID是本身写的类,用于生成UUID常量。
                ThreadContext.put("ip", request.getLocalAddr());
                chain.doFilter(request, response);
            } finally {
            //清除ThreadContext,避免内存泄露
                ThreadContext.clearAll();
            }
        }
    
        @Override
        public void destroy() {
    
        }
    
    }
    
     

    三、 web.xmlapp

    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
    
        <filter>
            <filter-name>log4jFilter</filter-name>
            <filter-class>demo.ThreadContextFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>log4jFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <servlet>
            <servlet-name>log4j2demo</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:applicationContext.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>log4j2demo</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
        <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>
            <welcome-file>index.jsp</welcome-file>
            <welcome-file>default.html</welcome-file>
            <welcome-file>default.htm</welcome-file>
            <welcome-file>default.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
    
     

    四、 Hello类测试运维

    package demo;
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    
    @Controller
    public class Hello {
        public static Logger logger = LogManager.getLogger();
    
        @RequestMapping("/hello")
        public void hello(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            logger.info("hello");
            request.getRequestDispatcher("index.jsp").forward(request, response);
        }
    }
    
     

    测试结果(屡次刷新页面)
    2017-06-28 21:04:59.013 INFO d.Hello:22 - IP:0:0:0:0:0:0:0:1&trace ID:5ba23654bc104e8b8019963084f16cb8 hellojsp

    2017-06-28 21:06:48.364 INFO d.Hello:22 - IP:0:0:0:0:0:0:0:1&trace ID:5ba23654bc104e8b8019963084f16cb8 helloide

    2017-06-28 21:06:49.203 INFO d.Hello:22 - IP:0:0:0:0:0:0:0:1&trace ID:5ba23654bc104e8b8019963084f16cb8 hello

    2017-06-28 21:06:49.900 INFO d.Hello:22 - IP:0:0:0:0:0:0:0:1&trace ID:5ba23654bc104e8b8019963084f16cb8 hello 其中IP:0:0:0:0:0:0:0:1等同于127.0.0.1,因为是本地访问,就会出现这个值。用别的机器访问就会正常。

  • 相关阅读:
    第一天
    python自测——其他内容
    python自测——正则表达式
    python自测——高级特性
    人机对战石头剪刀布代码
    [Usaco2004 Nov]Til the Cows Come Home 带奶牛回家
    Dijkstra概念
    洛谷p1339--热浪
    0-1背包问题变形------------cow exhibition
    [Poi2005]Piggy Banks小猪存钱罐
  • 原文地址:https://www.cnblogs.com/interdrp/p/15596599.html
Copyright © 2020-2023  润新知