Logging、ロギング


# Logging、ロギング
- オペレーティングシステムでは、System.out.println()のようなシステムコンソールを使用せず、別途のロギングライブラリを使用してログを出力する。
- ログを使えばThreadの情報、クラス名のような付加情報を一緒に見ることができ、出力の形を調整することができる。
- ログレベルを開発サーバーはdebug、ローカルではtrace、運営サーバーはinfoに設定できる。
- コンソールだけに出力するのではなく、ファイルやネットワークなど、ログを別の位置に残すことができる。 特にファイルとして残すときは、日替わり、特定の容量に応じてログを分割することも可能である。
    ```java
    private Logger log = LoggerFactory.getLogger(getClass());
    private static final Logger log = LoggerFactory.getLogger(Xxx.class)
    
    又は、lombok annotation（@Slf4j）を使用 
    ```
    ```java
    @Slf4j
    @RestController
    public class LogTestController {
        // private final Logger log = LoggerFactory.getLogger(getClass());
        //private final Logger log = LoggerFactory.getLogger(LogTestController.class);
    
        @RequestMapping("/log-test")
        public String logTest() {
            String name = "Spring";
    
            log.trace(" trace log={}", name);
            log.debug(" debug log={}", name);
            log.info(" info log={}", name);
            log.warn(" warn log={}", name);
            log.error(" error log={}", name);
    
            return "ok";
        }
    
    }
    
    2023-09-30 19:33:11.233  INFO 9964 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController  :  info log=Spring
    2023-09-30 19:33:11.234  WARN 9964 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController  :  warn log=Spring
    2023-09-30 19:33:11.234 ERROR 9964 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController  :  error log=Spring
    ```
- traceとdebugのログも見たい場合は、application.propertiesに以下の内容を作成する。
    ```java
    # trace, debugのログを見たい場合
    logging.level.hello.springmvc = trace
    
    # traceを除いてdebugレベルから見たい場合
    logging.level.hello.springmvc = debug
    
    # 何も書いてない基本はinfo
    ```

# ファイルへのログ出力
- application.propertiesにlog関連設定をするxmlファイルを作成する。
    ```java
    application.properties
    logging.config=classpath:logback.xml
    ```
- xmlファイルを作成し、以下の内容を記載する。
    ```xml
    <?xml version="1.0" encoding="UTF-8"？>
    <!-- 60秒ごとに設定ファイルの変更を確認して変更時更新-->
    <configuration scan="true" scanPeriod="60 seconds">
        <!--現在の日付-->
        <timestamp key="BY_DATE" datePattern="yyyyMMdd"/>
        <!--ログファイルが保存されるパス-->
        <property name="LOG_PATH" value="/temp/log"/>
        <!--ログファイル名-->
        <property name="LOG_FILE_NAME" value="LOG"/>
        <!-- ログ出力パターン-->
        <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] [%logger{40}] - %msg%n"/>
        <!--ログレベル-->
        <!--
            1) ERROR : エラーメッセージ表示
            2) WARN:警告メッセージ表示
            3) INFO : 情報性メッセージ表示
            4) DEBUG:デバッグするためのメッセージ表示
            5) TRACE:Debugよりはるかに詳細なメッセージ表示
            以下ではinfoに設定していますが、 この場合はINFOより上にあるDEBUGとTRACEは表示しない。
        -->
        <property name="LOG_LEVEL" value="info"/>
    
        <!-- CONSOLEにログ出力セッティング-->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <Pattern>${LOG_PATTERN}</Pattern>
            </encoder>
        </appender>
    
        <!-- Fileにログ出力セット-->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--ファイルパス設定-->
            <file>${LOG_PATH}/${BY_DATE}/${LOG_FILE_NAME}。log</file>
            <!--出力パターン設定-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>${LOG_PATTERN}</pattern>
            </encoder>
            <!--Rolling政策-->
            <rollingPolicy class="ch.qos.logback.core.rolling。TimeBasedRollingPolicy">
                <!---.gz,.zipなどを入れると自動日付別ログファイル圧縮-->
                <fileNamePattern>${LOG_PATH}/%d{yyyy-MM, aux}/${LOG_FILE_NAME}。%d{yyyy-MM-dd}.log</fileNamePattern>
                <!--日付別ログファイル最大保管周期(~日)、該当設定日以上のファイルは自動的に削除-->
                <!-- <maxHistory>30</maxHistory> -->
                <!-- ログ ファイルの最大保管サイズ。 最大サイズを超えると最も古いログ自動削除 -->
                <totalSizeCap>20GB</totalSizeCap>
            </rollingPolicy>
        </appender>
    
        <!--ログ全域セッティング-->
        <root level="${LOG_LEVEL}">
        <!--上に設定したコンソール設定追加-->
        <appender-ref ref="CONSOLE"/>
        <!--上に設定したファイル設定追加-->
        <appender-ref ref="FILE"/>
        </root>
    </configuration>
    ```