Log4j应该是目前项目开发中使用最广的日志记录框架,一般配置Log4j只需要配置Log4j的属性文件在src目录以及引入Log4j的jar包即可,但是如果项目比较大的时候,我们需要将一些配置文件放入自定义的项目目录里面,传统的方法显然不能满足需求,下面讲解一下Log4j在Springmvc项目中的配置及工作原理:
web.xml文件配置:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:config/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>6000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
context-param:配置ServletContext的初始化参数
Log4jConfigListener:配置Log4j的监听器
Log4jConfigListener的工作原理:
源码:
@Deprecated
public class Log4jConfigListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
Log4jWebConfigurer.initLogging(event.getServletContext());
}
@Override
public void contextDestroyed(ServletContextEvent event) {
Log4jWebConfigurer.shutdownLogging(event.getServletContext());
}
}
很显然Log4jConfigListener 通过实现ServletContextListener接口,随着Servlet容器的启动,其监听器的contextInitialized()方法就会被调用,Log4jConfigListener借助于Log4jWebConfigurer实现Log4j的初始化和关闭等操作
Log4jWebConfigurer的initLogging(ServletContext servletContext)方法:
public static void initLogging(ServletContext servletContext) {
// Expose the web app root system property.
if (exposeWebAppRoot(servletContext)) {
WebUtils.setWebAppRootSystemProperty(servletContext);
}
// Only perform custom log4j initialization in case of a config file.
String location = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
if (location != null) {
// Perform actual log4j initialization; else rely on log4j's default initialization.
try {
// Resolve property placeholders before potentially resolving a real path.
location = ServletContextPropertyUtils.resolvePlaceholders(location, servletContext);
// Leave a URL (e.g. "classpath:" or "file:") as-is.
if (!ResourceUtils.isUrl(location)) {
// Consider a plain file path as relative to the web application root directory.
location = WebUtils.getRealPath(servletContext, location);
}
// Write log message to server log.
servletContext.log("Initializing log4j from [" + location + "]");
// Check whether refresh interval was specified.
String intervalString = servletContext.getInitParameter(REFRESH_INTERVAL_PARAM);
if (StringUtils.hasText(intervalString)) {
// Initialize with refresh interval, i.e. with log4j's watchdog thread,
// checking the file in the background.
try {
long refreshInterval = Long.parseLong(intervalString);
org.springframework.util.Log4jConfigurer.initLogging(location, refreshInterval);
}
catch (NumberFormatException ex) {
throw new IllegalArgumentException("Invalid 'log4jRefreshInterval' parameter: " + ex.getMessage());
}
}
else {
// Initialize without refresh check, i.e. without log4j's watchdog thread.
org.springframework.util.Log4jConfigurer.initLogging(location);
}
}
catch (FileNotFoundException ex) {
throw new IllegalArgumentException("Invalid 'log4jConfigLocation' parameter: " + ex.getMessage());
}
}
}
工作流程:将web应用绝对路径添加到系统属性(支持log4j ${key}等获功能),方法内部读取ServletContext的初始化参数然后调用
org.springframework.util.Log4jConfigurer.initLogging(location, refreshInterval)完成Log4j的初始化工作
Log4j的关闭流程:
public static void shutdownLogging(ServletContext servletContext) {
servletContext.log("Shutting down log4j");
try {
org.springframework.util.Log4jConfigurer.shutdownLogging();
}
finally {
// Remove the web app root system property.
if (exposeWebAppRoot(servletContext)) {
WebUtils.removeWebAppRootSystemProperty(servletContext);
}
}
}
总之:真正的Log4j的初始化和关闭真正的执行者Log4jConfigurer,Log4jWebConfigurer只是Log4j在web环境下的支持
Log4j应该是目前项目开发中使用最广的日志记录框架,一般配置Log4j只需要配置Log4j的属性文件在src目录以及引入Log4j的jar包即可,但是如果项目比较大的时候,我们需要将一些配置文件放入自定义的项目目录里面,传统的方法显然不能满足需求,下面讲解一下Log4j在Springmvc项目中的配置及工作原理:
web.xml文件配置:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:config/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>6000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
context-param:配置ServletContext的初始化参数
Log4jConfigListener:配置Log4j的监听器
Log4jConfigListener的工作原理:
源码:
@Deprecated
public class Log4jConfigListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
Log4jWebConfigurer.initLogging(event.getServletContext());
}
@Override
public void contextDestroyed(ServletContextEvent event) {
Log4jWebConfigurer.shutdownLogging(event.getServletContext());
}
}
很显然Log4jConfigListener 通过实现ServletContextListener接口,随着Servlet容器的启动,其监听器的contextInitialized()方法就会被调用,Log4jConfigListener借助于Log4jWebConfigurer实现Log4j的初始化和关闭等操作
Log4jWebConfigurer的initLogging(ServletContext servletContext)方法:
public static void initLogging(ServletContext servletContext) {
// Expose the web app root system property.
if (exposeWebAppRoot(servletContext)) {
WebUtils.setWebAppRootSystemProperty(servletContext);
}
// Only perform custom log4j initialization in case of a config file.
String location = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
if (location != null) {
// Perform actual log4j initialization; else rely on log4j's default initialization.
try {
// Resolve property placeholders before potentially resolving a real path.
location = ServletContextPropertyUtils.resolvePlaceholders(location, servletContext);
// Leave a URL (e.g. "classpath:" or "file:") as-is.
if (!ResourceUtils.isUrl(location)) {
// Consider a plain file path as relative to the web application root directory.
location = WebUtils.getRealPath(servletContext, location);
}
// Write log message to server log.
servletContext.log("Initializing log4j from [" + location + "]");
// Check whether refresh interval was specified.
String intervalString = servletContext.getInitParameter(REFRESH_INTERVAL_PARAM);
if (StringUtils.hasText(intervalString)) {
// Initialize with refresh interval, i.e. with log4j's watchdog thread,
// checking the file in the background.
try {
long refreshInterval = Long.parseLong(intervalString);
org.springframework.util.Log4jConfigurer.initLogging(location, refreshInterval);
}
catch (NumberFormatException ex) {
throw new IllegalArgumentException("Invalid 'log4jRefreshInterval' parameter: " + ex.getMessage());
}
}
else {
// Initialize without refresh check, i.e. without log4j's watchdog thread.
org.springframework.util.Log4jConfigurer.initLogging(location);
}
}
catch (FileNotFoundException ex) {
throw new IllegalArgumentException("Invalid 'log4jConfigLocation' parameter: " + ex.getMessage());
}
}
}
工作流程:将web应用绝对路径添加到系统属性(支持log4j ${key}等获功能),方法内部读取ServletContext的初始化参数然后调用
org.springframework.util.Log4jConfigurer.initLogging(location, refreshInterval)完成Log4j的初始化工作
Log4j的关闭流程:
public static void shutdownLogging(ServletContext servletContext) {
servletContext.log("Shutting down log4j");
try {
org.springframework.util.Log4jConfigurer.shutdownLogging();
}
finally {
// Remove the web app root system property.
if (exposeWebAppRoot(servletContext)) {
WebUtils.removeWebAppRootSystemProperty(servletContext);
}
}
}
总之:真正的Log4j的初始化和关闭真正的执行者Log4jConfigurer,Log4jWebConfigurer只是Log4j在web环境下的支持
Log4j应该是目前项目开发中使用最广的日志记录框架,一般配置Log4j只需要配置Log4j的属性文件在src目录以及引入Log4j的jar包即可,但是如果项目比较大的时候,我们需要将一些配置文件放入自定义的项目目录里面,传统的方法显然不能满足需求,下面讲解一下Log4j在Springmvc项目中的配置及工作原理:
web.xml文件配置:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:config/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>6000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
context-param:配置ServletContext的初始化参数
Log4jConfigListener:配置Log4j的监听器
Log4jConfigListener的工作原理:
源码:
@Deprecated
public class Log4jConfigListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
Log4jWebConfigurer.initLogging(event.getServletContext());
}
@Override
public void contextDestroyed(ServletContextEvent event) {
Log4jWebConfigurer.shutdownLogging(event.getServletContext());
}
}
很显然Log4jConfigListener 通过实现ServletContextListener接口,随着Servlet容器的启动,其监听器的contextInitialized()方法就会被调用,Log4jConfigListener借助于Log4jWebConfigurer实现Log4j的初始化和关闭等操作
Log4jWebConfigurer的initLogging(ServletContext servletContext)方法:
public static void initLogging(ServletContext servletContext) {
// Expose the web app root system property.
if (exposeWebAppRoot(servletContext)) {
WebUtils.setWebAppRootSystemProperty(servletContext);
}
// Only perform custom log4j initialization in case of a config file.
String location = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
if (location != null) {
// Perform actual log4j initialization; else rely on log4j's default initialization.
try {
// Resolve property placeholders before potentially resolving a real path.
location = ServletContextPropertyUtils.resolvePlaceholders(location, servletContext);
// Leave a URL (e.g. "classpath:" or "file:") as-is.
if (!ResourceUtils.isUrl(location)) {
// Consider a plain file path as relative to the web application root directory.
location = WebUtils.getRealPath(servletContext, location);
}
// Write log message to server log.
servletContext.log("Initializing log4j from [" + location + "]");
// Check whether refresh interval was specified.
String intervalString = servletContext.getInitParameter(REFRESH_INTERVAL_PARAM);
if (StringUtils.hasText(intervalString)) {
// Initialize with refresh interval, i.e. with log4j's watchdog thread,
// checking the file in the background.
try {
long refreshInterval = Long.parseLong(intervalString);
org.springframework.util.Log4jConfigurer.initLogging(location, refreshInterval);
}
catch (NumberFormatException ex) {
throw new IllegalArgumentException("Invalid 'log4jRefreshInterval' parameter: " + ex.getMessage());
}
}
else {
// Initialize without refresh check, i.e. without log4j's watchdog thread.
org.springframework.util.Log4jConfigurer.initLogging(location);
}
}
catch (FileNotFoundException ex) {
throw new IllegalArgumentException("Invalid 'log4jConfigLocation' parameter: " + ex.getMessage());
}
}
}
工作流程:将web应用绝对路径添加到系统属性(支持log4j ${key}等获功能),方法内部读取ServletContext的初始化参数然后调用
org.springframework.util.Log4jConfigurer.initLogging(location, refreshInterval)完成Log4j的初始化工作
Log4j的关闭流程:
public static void shutdownLogging(ServletContext servletContext) {
servletContext.log("Shutting down log4j");
try {
org.springframework.util.Log4jConfigurer.shutdownLogging();
}
finally {
// Remove the web app root system property.
if (exposeWebAppRoot(servletContext)) {
WebUtils.removeWebAppRootSystemProperty(servletContext);
}
}
}
总之:真正的Log4j的初始化和关闭真正的执行者Log4jConfigurer,Log4jWebConfigurer只是Log4j在web环境下的支持
Log4j应该是目前项目开发中使用最广的日志记录框架,一般配置Log4j只需要配置Log4j的属性文件在src目录以及引入Log4j的jar包即可,但是如果项目比较大的时候,我们需要将一些配置文件放入自定义的项目目录里面,传统的方法显然不能满足需求,下面讲解一下Log4j在Springmvc项目中的配置及工作原理:
web.xml文件配置:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:config/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>6000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
context-param:配置ServletContext的初始化参数
Log4jConfigListener:配置Log4j的监听器
Log4jConfigListener的工作原理:
源码:
@Deprecated
public class Log4jConfigListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
Log4jWebConfigurer.initLogging(event.getServletContext());
}
@Override
public void contextDestroyed(ServletContextEvent event) {
Log4jWebConfigurer.shutdownLogging(event.getServletContext());
}
}
很显然Log4jConfigListener 通过实现ServletContextListener接口,随着Servlet容器的启动,其监听器的contextInitialized()方法就会被调用,Log4jConfigListener借助于Log4jWebConfigurer实现Log4j的初始化和关闭等操作
Log4jWebConfigurer的initLogging(ServletContext servletContext)方法:
public static void initLogging(ServletContext servletContext) {
// Expose the web app root system property.
if (exposeWebAppRoot(servletContext)) {
WebUtils.setWebAppRootSystemProperty(servletContext);
}
// Only perform custom log4j initialization in case of a config file.
String location = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
if (location != null) {
// Perform actual log4j initialization; else rely on log4j's default initialization.
try {
// Resolve property placeholders before potentially resolving a real path.
location = ServletContextPropertyUtils.resolvePlaceholders(location, servletContext);
// Leave a URL (e.g. "classpath:" or "file:") as-is.
if (!ResourceUtils.isUrl(location)) {
// Consider a plain file path as relative to the web application root directory.
location = WebUtils.getRealPath(servletContext, location);
}
// Write log message to server log.
servletContext.log("Initializing log4j from [" + location + "]");
// Check whether refresh interval was specified.
String intervalString = servletContext.getInitParameter(REFRESH_INTERVAL_PARAM);
if (StringUtils.hasText(intervalString)) {
// Initialize with refresh interval, i.e. with log4j's watchdog thread,
// checking the file in the background.
try {
long refreshInterval = Long.parseLong(intervalString);
org.springframework.util.Log4jConfigurer.initLogging(location, refreshInterval);
}
catch (NumberFormatException ex) {
throw new IllegalArgumentException("Invalid 'log4jRefreshInterval' parameter: " + ex.getMessage());
}
}
else {
// Initialize without refresh check, i.e. without log4j's watchdog thread.
org.springframework.util.Log4jConfigurer.initLogging(location);
}
}
catch (FileNotFoundException ex) {
throw new IllegalArgumentException("Invalid 'log4jConfigLocation' parameter: " + ex.getMessage());
}
}
}
工作流程:将web应用绝对路径添加到系统属性(支持log4j ${key}等获功能),方法内部读取ServletContext的初始化参数然后调用
org.springframework.util.Log4jConfigurer.initLogging(location, refreshInterval)完成Log4j的初始化工作
Log4j的关闭流程:
public static void shutdownLogging(ServletContext servletContext) {
servletContext.log("Shutting down log4j");
try {
org.springframework.util.Log4jConfigurer.shutdownLogging();
}
finally {
// Remove the web app root system property.
if (exposeWebAppRoot(servletContext)) {
WebUtils.removeWebAppRootSystemProperty(servletContext);
}
}
}
总之:真正的Log4j的初始化和关闭真正的执行者Log4jConfigurer,Log4jWebConfigurer只是Log4j在web环境下的支持