如何记录 HTTP GET 和 HTTP Post 来分隔文件
How to Log HTTP GET and HTTP Post to separate files
如何记录 HTTP @GET
和 @POST
以分隔文件。基本上我们只想有单独的日志文件用于读取(GET)和写入(PUT,POST,DELETE)。我将 Slf4j
与 logback
和嵌入式码头一起使用。
一个解决方案是在 class 中有两个记录器并相应地使用它们。即
private final static Logger log = LoggerFactory.getLogger(Controller.class);
private final static Logger writeLog = LoggerFactory.getLogger("WRITE");
现在根据要求使用上面的记录器,定义 Appender
和 Logger
。
<appender name="APPENDER_READ"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${HOME}/logs/read.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>read.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %X{TaskKey} %msg%n</pattern>
</encoder>
</appender>
<appender name="APPENDER_WRITE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${HOME}/logs/write.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>logs/write.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %X{TaskKey} %msg%n</pattern>
</encoder>
</appender>
<logger name="WRITE" level="warn" additivity="false">
<appender-ref ref="APPENDER_WRITE" />
</logger>
<root level="WARN">
<appender-ref ref="APPENDER_READ" />
</root>
但我正在寻找一些更好的解决方案,它可以不是从控制器而是从处理程序级别(一旦请求输入)开始记录。
您应该将请求方法(GET、POST 等)放入 Logback 的 MDC(映射诊断上下文)中。事实上,你应该尽早这样做,例如在过滤器中,像这样:
import javax.servlet.Filter;
import org.slf4j.MDC;
public class MDCFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
MDC.put("METHOD", ((HttpServletRequest)req).getMethod());
try {
chain.doFilter(req, resp);
} finally {
MDC.remove("METHOD");
}
}
}
然后可以根据MDC key的值'METHOD'用Logback的SiftingAppender直接登录不同的文件
很好的例子:https://www.mkyong.com/logging/logback-different-log-file-for-each-thread/(只需使用 'METHOD' 而不是 'logFileName')
如何记录 HTTP @GET
和 @POST
以分隔文件。基本上我们只想有单独的日志文件用于读取(GET)和写入(PUT,POST,DELETE)。我将 Slf4j
与 logback
和嵌入式码头一起使用。
一个解决方案是在 class 中有两个记录器并相应地使用它们。即
private final static Logger log = LoggerFactory.getLogger(Controller.class);
private final static Logger writeLog = LoggerFactory.getLogger("WRITE");
现在根据要求使用上面的记录器,定义 Appender
和 Logger
。
<appender name="APPENDER_READ"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${HOME}/logs/read.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>read.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %X{TaskKey} %msg%n</pattern>
</encoder>
</appender>
<appender name="APPENDER_WRITE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${HOME}/logs/write.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>logs/write.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %X{TaskKey} %msg%n</pattern>
</encoder>
</appender>
<logger name="WRITE" level="warn" additivity="false">
<appender-ref ref="APPENDER_WRITE" />
</logger>
<root level="WARN">
<appender-ref ref="APPENDER_READ" />
</root>
但我正在寻找一些更好的解决方案,它可以不是从控制器而是从处理程序级别(一旦请求输入)开始记录。
您应该将请求方法(GET、POST 等)放入 Logback 的 MDC(映射诊断上下文)中。事实上,你应该尽早这样做,例如在过滤器中,像这样:
import javax.servlet.Filter;
import org.slf4j.MDC;
public class MDCFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
MDC.put("METHOD", ((HttpServletRequest)req).getMethod());
try {
chain.doFilter(req, resp);
} finally {
MDC.remove("METHOD");
}
}
}
然后可以根据MDC key的值'METHOD'用Logback的SiftingAppender直接登录不同的文件
很好的例子:https://www.mkyong.com/logging/logback-different-log-file-for-each-thread/(只需使用 'METHOD' 而不是 'logFileName')