2017-07-28 12 views
0

ログファイルを作成できません。私はWEB-INFフォルダ内のlog4j.xmlを作成しているlog4jを使用してログファイルを生成できません。すべてが保存されます。

web.xmlの

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1"> 
    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 

    <context-param> 
     <param-name>log4j-config-location</param-name> 
     <param-value>/WEB-INF/log4j.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>*.form</url-pattern> 
    </servlet-mapping> 
</web-app> 

。以下は

のlog4j.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration debug="true" xmlns:log4j='http://jakarta.apache.org/log4j/'> 
    <!-- Appenders --> 
    <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
     <param name="Target" value="System.out" /> 
     <param name="Threshold" value="debug" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d %-5p %c{1}:%L %m %n" /> 
     </layout> 
    </appender> 

    <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender"> 
     <param name="Threshold" value="INFO" /> 
     <param name="Threshold" value="debug" /> 
     <param name="maxFileSize" value="20MB" /> 
     <param name="maxBackupIndex" value="10" /> 
     <param name="file" value="${catalina.home}/logs/myLog.log"/> 
     <param name="append" value="true" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L %m %n" /> 
     </layout> 
    </appender> 

    <!-- 3rdparty Loggers --> 
    <logger name="org.springframework.core"> 
     <level value="info" /> 
    </logger> 

    <logger name="org.springframework.beans"> 
     <level value="info" /> 
    </logger> 

    <logger name="org.springframework.context"> 
     <level value="info" /> 
    </logger> 

    <logger name="org.springframework.web"> 
     <level value="info" /> 
    </logger> 

    <!-- Root Logger --> 
    <root> 
     <priority value="info"></priority> 
     <appender-ref ref="fileAppender" /> 
    </root> 

</log4j:configuration> 

フォルダのプロジェクト構造である:

MyProject 
    src 
    web 
     WEB-INF 
      lib 
      web.xml,applicationContext.xml,log4j.xml,spring-config.xml... 

任意の提案が参考になります。 WEB-INFフォルダ内にファイルがあり、上記のようにweb.xmlにマッピングを与えましたが、tomcatサーバーが起動してもmyLog.logファイルが作成されません。私は何かを追加する必要がありますか?私が気づいたのは、Log4jConfigListennerが償却されたクラスだということです。クラスパスにlog4j-1.2.17.jarファイルがあります。私は、srcフォルダにログファイルを保存したくない、私はそれがWEB-INFフォルダにあることを望む。

--edit-- web.xmlでリスナーの宣言の順序を変更しましたが、ログファイルは生成されません。

<listener> 
      <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
     </listener> 
<listener> 
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
     </listener> 
+0

log4j起動時のデバッグ情報を有効にすることができるenv paramがあることを覚えています。あなたの診断に役立つかもしれません。 –

+0

https://stackoverflow.com/questions/3752921/is-it-possible-to-make-log4j-display-which-file-it-used-to-configure-itselfまず、正しいファイルが読み込まれます。次に、ファイルの内容を確認してください。 –

+0

@AdrianShum - 私の上記の投稿から欠落している要素/コードを教えてください。 – user8373379

答えて

0

Log4jConfigListener Javadocの上のweb.xml でリスナーの順序を確認してくださいが指定されている:カスタムのlog4jの初期化を使用した場合

このリスナーは、web.xmlでのContextLoaderListener前に登録する必要があります。

+0

web.xmlでリスナーの順序を変更してテストしました。それでもログファイルは生成されません。上記の私のweb.xmlを参照してください。 – user8373379

+0

param-nameをlog4jConfigLocationに変更してみてください。これはLog4jWebConfigurerの必要な名前です –

+0

Log4jConfigListennerが償却されたクラスです私はそれを使用することができますか、私は使用しているものとして、他のリスナクラスを使用する必要があります償却されます。ご意見をお聞かせください。 – user8373379

-1

クラスからloggerを呼び出して実行しましたか? はあなたのような::

public class LoggerUtils { 

    private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); 
    private static LoggerUtils LOGGER = null; 
    private static final int MAX_LOGFILE_SIZE_BYTES = 1024 * 1024 * 5; // 5MB 

    public static Logger getInstance() { 
     if(LOGGER == null) { 
      try { 
       initialize(); 
       LOGGER = new LoggerUtils(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return logger; 
    } 

    private static void initialize() throws IOException { 
     // Suppress the logging output to the console 
     Logger rootLogger = Logger.getLogger(""); 
     Handler[] handlers = rootLogger.getHandlers(); 
     if (handlers.length > 0 && handlers[0] instanceof ConsoleHandler) { 
      rootLogger.removeHandler(handlers[0]); 
     } 
     logger.setLevel(Level.ALL); 

     // Get the .log file path 
     String path = Platform.getLogFileLocation().toOSString(); 
     FileHandler fileTxt = new FileHandler(path, MAX_LOGFILE_SIZE_BYTES, 1); 
     FileHandler fileHTML = new FileHandler(path + ".html"); 

     // create a text format 
     SimpleFormatter formatterTxt = new SimpleFormatter(); 
     fileTxt.setFormatter(formatterTxt); 
     logger.addHandler(fileTxt); 

     // create an HTML format 
     LoggerHtmlFormatter formatterHTML = new LoggerHtmlFormatter(); 
     fileHTML.setFormatter(formatterHTML); 
     logger.addHandler(fileHTML); 
    } 
} 

class LoggerHtmlFormatter extends Formatter { 
    public String format(LogRecord rec) { 
     StringBuffer buf = new StringBuffer(1000); 
     buf.append("<tr>\n"); 

     if (rec.getLevel().intValue() >= Level.WARNING.intValue()) { 
      buf.append("\t<td style=\"color:red\">"); 
      buf.append("<b>"); 
      buf.append(rec.getLevel()); 
      buf.append("</b>"); 
     } else { 
      buf.append("\t<td>"); 
      buf.append(rec.getLevel()); 
     } 

     buf.append("</td>\n"); 
     buf.append("\t<td>"); 
     buf.append(calcDate(rec.getMillis())); 
     buf.append("</td>\n"); 
     buf.append("\t<td>"); 
     buf.append(formatMessage(rec)); 
     buf.append("</td>\n"); 
     buf.append("</tr>\n"); 

     return buf.toString(); 
    } 

    private String calcDate(long millisecs) { 
     SimpleDateFormat date_format = new SimpleDateFormat("MMM dd,yyyy HH:mm"); 
     Date resultdate = new Date(millisecs); 
     return date_format.format(resultdate); 
    } 

    public String getHead(Handler h) { 
     return "<!DOCTYPE html>\n<head>\n<style>\n" 
      + "table { width: 100% }\n" 
      + "th { font:bold 10pt Tahoma; }\n" 
      + "td { font:normal 10pt Tahoma; }\n" 
      + "h1 {font:normal 11pt Tahoma;}\n" 
      + "</style>\n" 
      + "</head>\n" 
      + "<body>\n" 
      + "<h1>" + (new Date()) + "</h1>\n" 
      + "<table border=\"0\" cellpadding=\"5\" cellspacing=\"3\">\n" 
      + "<tr align=\"left\">\n" 
      + "\t<th style=\"width:10%\">Loglevel</th>\n" 
      + "\t<th style=\"width:15%\">Time</th>\n" 
      + "\t<th style=\"width:75%\">Log Message</th>\n" 
      + "</tr>\n"; 
     } 

    public String getTail(Handler h) { 
     return "</table>\n</body>\n</html>"; 
    } 
} 

JAVAロガーUtilsのクラスを使用して試してみて、注意を行うことができ、あなたはLoggerUtils.getInstance(level.SEVERE、「ANYTHING」)のようないくつかのJavaクラスから、このいずれかを呼び出す必要があります。そのクラスを実行します。ロガーは、そのファイルが作成されていない場合でも、呼び出されたときにのみ生成されるか、または一部のログが出力されます。