【闘医】【3】Webアプリケーション開発20日間


上記で異常に言及した中英語は資源ファイルから読み取り、失敗したらログ記録が必要となりますので、ネット上ではドタバタしているログバックを使って記録します.LogbackとLog 4 jについてはここで評価と説明をしません.すべての疑問はGoogleに教えてください.
一、Logbackの使用前準備
1、公式サイトでhttp://logback.qos.ch/download.htmlLogbackをダウンロードします公式サイトでhttp://www.slf4j.org/download.htmlsf 4 jをダウンロード
2、D:\medical\war\WEB-INFの下でlibフォルダを作成し、本アプリケーションを置くために必要なJARパッケージ
3、上記のダウンロードを解凍して、logback-access-1.0.13.jar、logback-classi-1.0.13.jar、logback-core-1.0.13.jarとsf 4 j-ap-1.7.5.jarをDにコピーします.
二、試験類
次は手書きで、本アプリケーションに関係のないテストクラスのFrame Logger.javaです.
1、Eclipseを開けて、medical工程で右ボタンを押して、「New」Classを選んで、Packageは「comp.medical.frame」を記入し、Nameは「Frame Loggar Demo」を記入し、「Finish」をクリックしてください.
2、ログクラスを使うには、まずロガーを定義してからこのオブジェクトを使うので、コードは以下の通りです.
package com.medical.frame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FrameLoggerDemo
{
    private static final Logger logger = LoggerFactory.getLogger(FrameLoggerDemo.class);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
    public static void main(String[] args)
    {
        logger.info("It's test for logback.");
    }
}
3、上のコードのコンパイルが通らないことが分かります.これは正常です.Eclipseは必要なjarパッケージを導入していません.右ボタンmedicalプロジェクトは「Properties」Java Build Path」Libries>「Add JARs」を選択し、JAR選択ウィンドウでD:\medical\war\WEB-INF\libのjarパッケージを追加します.
075231871.png
4、ログをコンソールに印刷するだけでなく、ログファイルにプリントしたいです.さらにデータベースに挿入したいです.XMLプロファイルは完成に協力できます.D:\medical\war\でETCフォルダを作成し、ETCでlogconfig.xmlファイルを作成します.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--         ,         -->
    <property name="LOG_HOME" value="D:/log" />
    <!--        -->
    <timestamp key="fileSuffix" datePattern="yyyyMMdd'_'HHmm" />
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    <!--     -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--               -->
        <Encoding>UTF-8</Encoding>
        <!--            -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <!--%d    ; %thread     ; %-5level      5         ; %logger     ; %msg      ; %n    -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} - %msg%n</pattern>
        </layout>
    </appender>
    <!--    -->
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--               -->
        <Encoding>UTF-8</Encoding>
        <!--        -->
        <file>${LOG_HOME}/trace${fileSuffix}.txt</file>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
        <!--          -->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <!--              zip -->
            <fileNamePattern>${LOG_HOME}/trace${fileSuffix}.%i.zip</fileNamePattern>
            <!--   10 zip   ,  10      -->
            <minIndex>1</minIndex>
            <maxIndex>10</maxIndex>
        </rollingPolicy>  
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
        <!--    5M           ,         zip -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>
        <!--           -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} - %msg%n </pattern>
        </encoder>
    </appender>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    <!--      -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>
【備考】この配置ファイルについて興味のある読者に、自分で配置してこそ、各ラベルの意味を体験することができます.
5、Frame LoggarrDemoを実行して、指定されたD:/logでログファイルを出力していないことを発見しました.考えてみてください.Logbackの出力戦略は何ですか?どうして分かりますか?ですから、ここではmain()が動作する前にlogconfig.xmlを読み込む必要がありますが、どうやってロードしますか?どうして一回だけ読み込むのですか?いろいろな方法があります.Springの単例工場を利用できます.ここでは単例クラスを使います.
private static FrameLoggerDemo instance = new FrameLoggerDemo();
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
private FrameLoggerDemo()
{
    String logbackCfg = "D:\\medical\\war\\etc\\logconfig.xml";
    ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
    JoranConfigurator configurator = new JoranConfigurator();
    configurator.setContext((LoggerContext) loggerFactory);
    try
    {
        configurator.doConfigure(logbackCfg);
    }
    catch (JoranException e)
    {
        e.printStackTrace();
    }
}
もう一度実行してください.ログファイルが出力されました.j_0005.gif.
三、闘医はどうやってロックを使いますか?
上のFrame Loggar Demoから見ると、システムはロギングオブジェクトを使用する前に配置ファイルをロードしなければなりません.webアプリケーションには複数のServletから構成されていますので、最初のServlet起動時にロードして、後続の利用者はそのまま使用すればいいです.
1、D:\medical\war\WEB-INF\web.xmlでactionという名前のservletを定義します.
<web-app>
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>com.medical.frame.FrameLauncher</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.act</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
         <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>
2、このservletは、クライアントの要求が*.actの場合は、actionという名前のservletを使用して処理し、プロセッサはFrame Launcherというクラスであり、HttpServletを継承しなければならないと説明している.Servletは一般にinit、doGet、doPost、destory方法で構成されているので、Frame Launcherも例外ではなく、この4つの方法を書き換える必要があります.
package com.medical.frame;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 *          
 */
public class FrameLauncher extends HttpServlet
{
    @Override
    public void init() throws ServletException
    {
                                                                                                                                                                                                                                                                                                                                                                                                                           
    }
                                                                                                                                                                                                                                                                                                                                                                                                                       
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException
    {
                                                                                                                                                                                                                                                                                                                                                                                                                           
    }
                                                                                                                                                                                                                                                                                                                                                                                                                       
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException
    {
        doGet(request, response);
    }
                                                                                                                                                                                                                                                                                                                                                                                                                       
    @Override
    public void destroy()
    {
                                                                                                                                                                                                                                                                                                                                                                                                                           
    }
}
3、request要求がWebコンテナに到達すると、要求パラメータに基づいてどのservlet処理を使用するかを判断し、servletが最初に呼び出された時には、定義されたクラスを反射して、init()方法を呼び出して初期化する.私たちのログを読み込むとここで処理できます.
comp.medical.frame.util.Frame eConfigUtil.javaを定義し、静的方法initLogConfig()をlogbackログプロファイルをロードするために定義します.
public class FrameConfigUtil
{
    /**
     *   Logback      
     */
    public static void initLogConfig(ServletContext context)
    {
        //   logback    
        StringBuilder logConfigPath = new StringBuilder(context.getRealPath("/"));
        logConfigPath.append("etc").append(File.separator).append("logconfig.xml");
                                                                                                                                                                                                                                                                                                                                     
        //   logback    
        ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext((LoggerContext) loggerFactory);
        try
        {
            configurator.doConfigure(logConfigPath.toString());
        }
        catch (JoranException e)
        {
            System.out.println("[  ] init logback config error.
" + e.getMessage());         }     } }
4、Frame Launcher.init()メソッド呼び出しFrame ConfigUtil.init LogConfig()
@Override
public void init() throws ServletException
{
    ServletContext context = getServletContext();
    FrameConfigUtil.initLogConfig(context);
}
ここまでlogbackのプロファイルはactionというservletの初期化時にロードされましたが、どうやってテストしますか?
5、修正D:\medical\war\index.ファイルの内容は以下の通りです.
<html>
    <head>
        <title>medical</title>   
    </head>
    <body>
        <a href="index.act">Test Logback</a>
    </body>
</html>
6、comp.medical.frame.Frame Launcher.doGetを書き換える方法
/**
 *       
 */
private static final Logger logger = LoggerFactory.getLogger(FrameLauncher.class);
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException
{
    logger.error("It's test for logback.");
}
このようにブラウザに入力するとhttp://localhost:8080/medicalは、web.xmlので定義されています.知っているシステムは、まずindex.ファイルをロードします.マウスでTest Logbackをクリックするとindex.actのHTTP要求がTomcat容器に送られます.Tomcatはweb.xmlの*.actに従って、対応するサービスを見つけます.その後、反射的にcomp.medical.frame.Frame Launcher.javaをロードし、Frame Laucherがロードする時にinit()メソッドを呼び出してlogconfig.xmlを読み込み、HTT要求をHttpServReqeust要求に変換してdoGet()に渡してログを印刷します.
【備考1】ユーザーが最初から最後までこのアプリケーションを書くと、D:\logでログファイルが生成されていますが、内容がないことが分かります.これはlogconfig.xmlをロードする際に使うJoran Configratorが正しくない可能性があります.import ch.qos.logback.classic.jran.Joran Configratorを使用すべきで、import ch.qos.logback.access.joron.Joran Configratorではない.
【備考2】:実際にこの実例を操作する時に問題があったら、添付ファイルを参照してもいいし、コメントしてもいいです.