当前位置 博文首页 > 适己而忘人者,人之所弃;克己而立人者,众之所戴。:解决问题(

    适己而忘人者,人之所弃;克己而立人者,众之所戴。:解决问题(

    作者:[db:作者] 时间:2021-07-11 12:37

    这些是昨天遇到的问题。主要解决问题是

    1)启动Tomcat控制台每次都会有以下错误:

    log4j:WARN No appenders could be found for logger (org.apache.struts.util.PropertyMessageResources).
    log4j:WARN Please initialize the log4j system properly.

    2)加入log4j.properties到环境中,log信息不能正确输入到文件中

    对于问题1,经查过一些资料后,比较赞同的原因是log4j没有在actionServlet初始化之前初始化。我并没有确切的依据,赞同的原因是根据Tomcat启动时打出来的log信息判断,初始化顺序是最合理的解释。

    看到一种解决方法就是自己写一个log4jInit的Servlet,代码如下:

    import org.apache.log4j.*;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class Log4jinit extends HttpServlet {
    ??public void init() {
    ????String prefix = getServletContext().getRealPath("/");
    ????String file = getInitParameter("log4j");
    ????if (file != null) {
    ??????PropertyConfigurator.configure(prefix + file);
    ????}
    ??}
    }

    web.xml 的设置
    <servlet>
    ????<servlet-name>log4j-init</servlet-name>
    ????<servlet-class>Log4j.Log4jinit</servlet-class>
    ????<init-param>
    ??????<param-name>log4j</param-name>
    ??????<param-value>WEB-INF/log4j.properties</param-value>
    ????</init-param>
    ????<load-on-startup>1</load-on-startup>
    ??</servlet>

    但是在我的环境中并不生效。我采取的是另一种办法:

    在web.xml加入如下代码:

    <context-param>
    ?<param-name>log4jConfigLocation</param-name>
    ??? <param-value>/WEB-INF/log4j.xml</param-value>
    ? </context-param>
    ? <context-param>
    ??? <param-name>log4jRefreshInterval</param-name>
    ??? <param-value>60000</param-value>
    ? </context-param>
    ? <listener>
    ?<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    ? </listener>

    说明:在上文的配置里,在上文的配置里,Log4jConfigListener会去WEB-INF/log4j.xml 读取配置文件;开一条watchdog线程每60秒扫描一下配置文件的变化(这样在web服务启动后再去修改配置文件也不用重新启动web服务了);并把web目录的路径压入一个叫webapp.root的系统变量(webapp.root将在log4j.xml文件中使用)。

    用这段代码就解决了问题1,而且用这种方式可以随便更改配置文件的位置,不一定放在默认的工程的src下

    问题2主要是log文件输出路径的问题。看了很多网上的信息都是说要写绝对路径,其实还有别的方法。

    第一种方法是使用参数“${catalina.home}”举例:

    log4j.appender.rollingFile.File=${catalina.home}/webapps/FullProject/WEB-INF/log/logInfo.log

    catalina.home指的是Tomcat的安装目录,用这个和绝对路径相比灵活了一些,不过还是要自己添加几层目录,如例子上的/webapps/FullProject/, 但也不够灵活。

    第二种方法是使用参数“${webapp.root}”,用MyEclipse deploy数据到Tomcat,所生成的war包就是放在webapps这个目录下面,足够灵活。不过对于其他web server是否支持这个参数并没有进行验证。

    cs