• SpringMVC集成LogBack,相关配置



         最近在做项目中需要用到日志,本来选取的是Log4j,最后经过对比之后还是发现LogBack在性能上比Log4j有优势。至于有什么好处,请参考下面这篇文章。

    从Log4j迁移到LogBack的理由


        下面废话不多说了,就看一下,如何来把LogBack集成到我们的web项目中吧。本人前台用的是SpringMVC。

        jar包配置
       如果要使用LogBack做为日志的插件的话,需要的jar包有如下,直接看一下Maven依赖

    1. <span style="font-family:Comic Sans MS;font-size:18px;"><dependency>
    2. <groupId>org.slf4j</groupId>
    3. <artifactId>slf4j-api</artifactId>
    4. <version>1.7.12</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>ch.qos.logback</groupId>
    8. <artifactId>logback-classic</artifactId>
    9. <version>1.1.3</version>
    10. <scope>compile</scope>
    11. <exclusions>
    12. <exclusion>
    13. <artifactId>slf4j-api</artifactId>
    14. <groupId>org.slf4j</groupId>
    15. </exclusion>
    16. </exclusions>
    17. </dependency>
    18. <dependency>
    19. <groupId>ch.qos.logback</groupId>
    20. <artifactId>logback-core</artifactId>
    21. <version>1.1.3</version>
    22. <exclusions>
    23. <exclusion>
    24. <groupId>org.slf4j</groupId>
    25. <artifactId>slf4j-api</artifactId>
    26. </exclusion>
    27. </exclusions>
    28. <scope>compile</scope>
    29. </dependency>
    30. <dependency>
    31. <groupId>ch.qos.logback</groupId>
    32. <artifactId>logback-access</artifactId>
    33. <version>1.1.3</version>
    34. <exclusions>
    35. <exclusion>
    36. <groupId>org.slf4j</groupId>
    37. <artifactId>slf4j-api</artifactId>
    38. </exclusion>
    39. </exclusions>
    40. <scope>compile</scope>
    41. </dependency></span>
       
        Web.xml
          在web项目中需要通过web.xml来加载我们所需要的LogBack.xml具体如下
    1. <span style="font-family:Comic Sans MS;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
    2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    6. <!-- logback-begin -->
    7. <context-param>
    8. <param-name>logbackConfigLocation</param-name>
    9. <param-value> classpath:logback.xml</param-value>
    10. </context-param>
    11. <listener>
    12. <listener-class>com.util.LogbackConfigListener</listener-class>
    13. </listener>
    14. <!-- logback-end -->
    15. <filter>
    16. <filter-name>encodingFilter</filter-name>
    17. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    18. <init-param>
    19. <param-name>encoding</param-name>
    20. <param-value>UTF-8</param-value>
    21. </init-param>
    22. <init-param>
    23. <param-name>forceEncoding</param-name>
    24. <param-value>true</param-value>
    25. </init-param>
    26. </filter>
    27. <filter-mapping>
    28. <filter-name>encodingFilter</filter-name>
    29. <url-pattern>/*</url-pattern>
    30. </filter-mapping>
    31. <servlet>
    32. <servlet-name>springMVC</servlet-name>
    33. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    34. <init-param>
    35. <param-name>contextConfigLocation</param-name>
    36. <param-value> classpath:springMVC-servlet.xml</param-value>
    37. </init-param>
    38. <load-on-startup>1</load-on-startup>
    39. </servlet>
    40. <!-- 这里一定要是/根据Servlet规范来的 -->
    41. <servlet-mapping>
    42. <servlet-name>springMVC</servlet-name>
    43. <url-pattern>/</url-pattern>
    44. </servlet-mapping>
    45. </web-app></span>

       上面的XML中用到了自定义的监听器,分别是三个类,如下所示

       LogbackConfigListener类
    1. <span style="font-family:Comic Sans MS;font-size:18px;">package com.util;
    2. import javax.servlet.ServletContextEvent;
    3. import javax.servlet.ServletContextListener;
    4. public class LogbackConfigListener implements ServletContextListener {
    5. public void contextInitialized(ServletContextEvent event) {
    6. LogbackWebConfigurer.initLogging(event.getServletContext());
    7. }
    8. public void contextDestroyed(ServletContextEvent event) {
    9. LogbackWebConfigurer.shutdownLogging(event.getServletContext());
    10. }
    11. }
    12. </span>

       LogbackConfigurer类
    1. <span style="font-family:Comic Sans MS;font-size:18px;">package com.util;
    2. import java.io.File;
    3. import java.io.FileNotFoundException;
    4. import java.net.URL;
    5. import org.slf4j.LoggerFactory;
    6. import org.springframework.util.ResourceUtils;
    7. import org.springframework.util.SystemPropertyUtils;
    8. import ch.qos.logback.classic.LoggerContext;
    9. import ch.qos.logback.classic.joran.JoranConfigurator;
    10. import ch.qos.logback.core.joran.spi.JoranException;
    11. public abstract class LogbackConfigurer {
    12. /** Pseudo URL prefix for loading from the class path: "classpath:" */
    13. public static final String CLASSPATH_URL_PREFIX = "classpath:";
    14. /** Extension that indicates a logback XML config file: ".xml" */
    15. public static final String XML_FILE_EXTENSION = ".xml";
    16. private static LoggerContext lc = (LoggerContext) LoggerFactory
    17. .getILoggerFactory();
    18. private static JoranConfigurator configurator = new JoranConfigurator();
    19. /**
    20. * Initialize logback from the given file location, with no config file
    21. * refreshing. Assumes an XML file in case of a ".xml" file extension, and a
    22. * properties file otherwise.
    23. *
    24. * @param location
    25. * the location of the config file: either a "classpath:"
    26. * location (e.g. "classpath:mylogback.properties"), an absolute
    27. * file URL (e.g.
    28. * "file:C:/logback.properties), or a plain absolute path in the file system (e.g. "
    29. * C:/logback.properties")
    30. * @throws FileNotFoundException
    31. * if the location specifies an invalid file path
    32. */
    33. public static void initLogging(String location)
    34. throws FileNotFoundException {
    35. String resolvedLocation = SystemPropertyUtils
    36. .resolvePlaceholders(location);
    37. URL url = ResourceUtils.getURL(resolvedLocation);
    38. if (resolvedLocation.toLowerCase().endsWith(XML_FILE_EXTENSION)) {
    39. // DOMConfigurator.configure(url);
    40. configurator.setContext(lc);
    41. lc.reset();
    42. try {
    43. configurator.doConfigure(url);
    44. } catch (JoranException ex) {
    45. throw new FileNotFoundException(url.getPath());
    46. }
    47. lc.start();
    48. }
    49. // else {
    50. // PropertyConfigurator.configure(url);
    51. // }
    52. }
    53. /**
    54. * Shut down logback, properly releasing all file locks.
    55. * <p>
    56. * This isn't strictly necessary, but recommended for shutting down logback
    57. * in a scenario where the host VM stays alive (for example, when shutting
    58. * down an application in a J2EE environment).
    59. */
    60. public static void shutdownLogging() {
    61. lc.stop();
    62. }
    63. /**
    64. * Set the specified system property to the current working directory.
    65. * <p>
    66. * This can be used e.g. for test environments, for applications that
    67. * leverage logbackWebConfigurer's "webAppRootKey" support in a web
    68. * environment.
    69. *
    70. * @param key
    71. * system property key to use, as expected in logback
    72. * configuration (for example: "demo.root", used as
    73. * "${demo.root}/WEB-INF/demo.log")
    74. * @see org.springframework.web.util.logbackWebConfigurer
    75. */
    76. public static void setWorkingDirSystemProperty(String key) {
    77. System.setProperty(key, new File("").getAbsolutePath());
    78. }
    79. }
    80. </span>

      LogbackWebConfigurer类
    1. <span style="font-family:Comic Sans MS;font-size:18px;">package com.util;
    2. import java.io.FileNotFoundException;
    3. import javax.servlet.ServletContext;
    4. import org.springframework.util.ResourceUtils;
    5. import org.springframework.util.SystemPropertyUtils;
    6. import org.springframework.web.util.WebUtils;
    7. public abstract class LogbackWebConfigurer {
    8. /** Parameter specifying the location of the logback config file */
    9. public static final String CONFIG_LOCATION_PARAM = "logbackConfigLocation";
    10. /**
    11. * Parameter specifying the refresh interval for checking the logback config
    12. * file
    13. */
    14. public static final String REFRESH_INTERVAL_PARAM = "logbackRefreshInterval";
    15. /** Parameter specifying whether to expose the web app root system property */
    16. public static final String EXPOSE_WEB_APP_ROOT_PARAM = "logbackExposeWebAppRoot";
    17. /**
    18. * Initialize logback, including setting the web app root system property.
    19. *
    20. * @param servletContext
    21. * the current ServletContext
    22. * @see WebUtils#setWebAppRootSystemProperty
    23. */
    24. public static void initLogging(ServletContext servletContext) {
    25. // Expose the web app root system property.
    26. if (exposeWebAppRoot(servletContext)) {
    27. WebUtils.setWebAppRootSystemProperty(servletContext);
    28. }
    29. // Only perform custom logback initialization in case of a config file.
    30. String location = servletContext
    31. .getInitParameter(CONFIG_LOCATION_PARAM);
    32. if (location != null) {
    33. // Perform actual logback initialization; else rely on logback's
    34. // default initialization.
    35. try {
    36. // Return a URL (e.g. "classpath:" or "file:") as-is;
    37. // consider a plain file path as relative to the web application
    38. // root directory.
    39. if (!ResourceUtils.isUrl(location)) {
    40. // Resolve system property placeholders before resolving
    41. // real path.
    42. location = SystemPropertyUtils
    43. .resolvePlaceholders(location);
    44. location = WebUtils.getRealPath(servletContext, location);
    45. }
    46. // Write log message to server log.
    47. servletContext.log("Initializing logback from [" + location
    48. + "]");
    49. // Initialize without refresh check, i.e. without logback's
    50. // watchdog thread.
    51. LogbackConfigurer.initLogging(location);
    52. } catch (FileNotFoundException ex) {
    53. throw new IllegalArgumentException(
    54. "Invalid 'logbackConfigLocation' parameter: "
    55. + ex.getMessage());
    56. }
    57. }
    58. }
    59. /**
    60. * Shut down logback, properly releasing all file locks and resetting the
    61. * web app root system property.
    62. *
    63. * @param servletContext
    64. * the current ServletContext
    65. * @see WebUtils#removeWebAppRootSystemProperty
    66. */
    67. public static void shutdownLogging(ServletContext servletContext) {
    68. servletContext.log("Shutting down logback");
    69. try {
    70. LogbackConfigurer.shutdownLogging();
    71. } finally {
    72. // Remove the web app root system property.
    73. if (exposeWebAppRoot(servletContext)) {
    74. WebUtils.removeWebAppRootSystemProperty(servletContext);
    75. }
    76. }
    77. }
    78. /**
    79. * Return whether to expose the web app root system property, checking the
    80. * corresponding ServletContext init parameter.
    81. *
    82. * @see #EXPOSE_WEB_APP_ROOT_PARAM
    83. */
    84. private static boolean exposeWebAppRoot(ServletContext servletContext) {
    85. String exposeWebAppRootParam = servletContext
    86. .getInitParameter(EXPOSE_WEB_APP_ROOT_PARAM);
    87. return (exposeWebAppRootParam == null || Boolean
    88. .valueOf(exposeWebAppRootParam));
    89. }
    90. }
    91. </span>


       logback.XML配置
    下面来看一下这个xml是如何配置的
    1. <span style="font-family:Comic Sans MS;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
    2. <!-- ROOT 节点 -->
    3. <!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
    4. debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
    5. <configuration scan="true" scanPeriod="60 seconds" debug="false">
    6. <!-- 定义日志文件 输入位置,注意此处的/ -->
    7. <property name="log_dir" value="E:/logs" />
    8. <!-- 日志最大的历史 60天 -->
    9. <property name="maxHistory" value="60"></property>
    10. <!-- 控制台输出日志 -->
    11. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    12. <encoder>
    13. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
    14. %msg%n</pattern>
    15. </encoder>
    16. </appender>
    17. <!-- 出错日志 appender -->
    18. <appender name="ERROR"
    19. class="ch.qos.logback.core.rolling.RollingFileAppender">
    20. <!-- 在多数的Log工具中,级别是可以传递,例如如果指定了日志输出级别为DEBUG, 那么INFO、ERROR级别的log也会出现在日志文件。这种默认给程序的调试带来了很多的麻烦
    21. 通过配置Filter 来严格控制日志输入级别 <filter class="ch.qos.logback.classic.filter.LevelFilter">
    22. <level>ERROR/level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch>
    23. </filter> -->
    24. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    25. <!-- 按天回滚 daily -->
    26. <fileNamePattern>${log_dir}/error-log-%d{yyyy-MM-dd}.log
    27. </fileNamePattern>
    28. <!-- 日志最大的历史 60天 -->
    29. <maxHistory>${maxHistory}</maxHistory>
    30. </rollingPolicy>
    31. <encoder>
    32. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
    33. %msg%n</pattern>
    34. </encoder>
    35. </appender>
    36. <!-- INFO 日志 appender -->
    37. <appender name="INFO"
    38. class="ch.qos.logback.core.rolling.RollingFileAppender">
    39. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    40. <!-- 按天回滚 daily -->
    41. <fileNamePattern>${log_dir}/info-log-%d{yyyy-MM-dd}.log
    42. </fileNamePattern>
    43. <!-- 日志最大的历史 60天 -->
    44. <maxHistory>${maxHistory}</maxHistory>
    45. </rollingPolicy>
    46. <encoder>
    47. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
    48. %msg%n</pattern>
    49. </encoder>
    50. </appender>
    51. <!-- 访问日志 appender -->
    52. <appender name="ACCESS"
    53. class="ch.qos.logback.core.rolling.RollingFileAppender">
    54. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    55. <!-- 按天回滚 daily -->
    56. <fileNamePattern>${log_dir}/access-log-%d{yyyy-MM-dd}.log
    57. </fileNamePattern>
    58. <!-- 日志最大的历史 60天 -->
    59. <maxHistory>${maxHistory}</maxHistory>
    60. </rollingPolicy>
    61. <encoder>
    62. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
    63. %msg%n</pattern>
    64. </encoder>
    65. </appender>
    66. <!-- 系统用户操作日志 appender -->
    67. <appender name="SYS-USER"
    68. class="ch.qos.logback.core.rolling.RollingFileAppender">
    69. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    70. <!-- 按天回滚 daily -->
    71. <fileNamePattern>${log_dir}/sys_user-log-%d{yyyy-MM-dd}.log
    72. </fileNamePattern>
    73. <!-- 日志最大的历史 60天 -->
    74. <maxHistory>${maxHistory}</maxHistory>
    75. </rollingPolicy>
    76. <encoder>
    77. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
    78. %msg%n</pattern>
    79. </encoder>
    80. </appender>
    81. <!-- 打印SQL输出 -->
    82. <logger name="java.sql.Connection" level="DEBUG" />
    83. <logger name="java.sql.Statement" level="DEBUG" />
    84. <logger name="java.sql.PreparedStatement" level="DEBUG" />
    85. <!--error错误日志 additivity="false"表示不向上传递 -->
    86. <!-- <logger name="com.test" level="error" > -->
    87. <!-- <appender-ref ref="ERROR" /> -->
    88. <!-- </logger> -->
    89. <!--info日志 -->
    90. <logger name="com.test" level="info" additivity="false">
    91. <appender-ref ref="INFO" />
    92. </logger>
    93. <!--访问日志 -->
    94. <!-- <logger name="com.test" level="info" additivity="false"> -->
    95. <!-- <appender-ref ref="ACCESS" /> -->
    96. <!-- </logger> -->
    97. <!--系统用户操作日志 -->
    98. <!-- <logger name="com.test" level="info" additivity="false"> -->
    99. <!-- <appender-ref ref="SYS-USER" /> -->
    100. <!-- </logger> -->
    101. <root>
    102. <level value="INFO" />
    103. <appender-ref ref="stdout" />
    104. </root>
    105. </configuration></span>


    关于这个XML文件的详细讲解请参考http://blog.csdn.net/haidage/article/details/6794509

  • 相关阅读:
    【HDU3721】枚举+最长路
    满足要求的最长上升子序列(nlogn)
    Flask入门 表单Flask-wtf form原生 Bootstrap渲染(七)
    Flask入门之模板导入与块宏(六)
    Flask入门模板过滤器与测试器(五)
    Flask入门模板Jinja2语法与函数(四)
    Flask入门flask-script 蓝本 钩子函数(三)
    Flask入门request session cookie(二)
    Flask入门 flask结构 url_for 重定向(一)
    Django问卷调查项目思路流程
  • 原文地址:https://www.cnblogs.com/tanghaoran-blog/p/10404897.html
Copyright © 2020-2023  润新知