## 動機
- spring-bootアプリケーションのlogを残したいな。
- 環境ごとに出力を変えたい
- 本番ならば特定のディレクトリにファイルでlogLevelはinfoかな
- ローカルならば標準出力にlogLevelはdebugかな
リポジトリ
以前作ったここを流用します:https://github.com/mijinco0612-self-improvement/spring-auth0
##やってみる
先ずはpomにdependencyを追加
pom.xml
<!-- Logging -->
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
</dependency>
出力するだけであればlogbackのみでOK。
環境毎に設定を変える場合janinoが必要です。
resourcesディレクトリにlogback.xmlを追加
logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 共通設定 -->
<property name="LOG_DIR" value="/var/www/logs" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/spring-auth0.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/spring-auth0.log.%d{yyyy-MM-dd}</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} |%t| [%p] %c %msg %n</pattern>
</encoder>
</appender>
<if condition='isDefined("spring.profiles.active")'>
<then>
<include resource="logback/${spring.profiles.active}.xml"/>
</then>
<else>
<include resource="logback/prd.xml"/>
</else>
</if>
</configuration>
resources > logbackディレクトリに環境毎の設定ファイルを作成します。
local.xml(ローカル環境用)
<included>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} |%t| [%p] %c %msg %n</pattern>
</encoder>
</appender>
<logger name="com.mijinco0612.springauth0" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="org.springframework" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="org.apache.catalina" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
</included>
prd.xml(本番環境用)
<included>
<logger name="com.mijinco0612.springauth0" level="INFO" additivity="false">
<appender-ref ref="FILE"/>
</logger>
<logger name="org.springframework" level="INFO" additivity="false">
<appender-ref ref="FILE"/>
</logger>
<logger name="org.apache.catalina" level="INFO" additivity="false">
<appender-ref ref="FILE"/>
</logger>
</included>
切り替えはどうするのか?
環境ごとのprofile(yml)を用意して起動時に指定します。
application-local.yml
application-prd.yml
をresourcesディレクトリに作成しました。
今回はapplicaiton.ymlと設定値に違いがないため中身は空のままとしています。
試してみよう。
localプロファイルを指定した場合
~/s/spring-auth0 ❯❯❯ mvn clean spring-boot:run -U -Dspring.profiles.active=local ✘ 10
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< com.mijinco0612:spring-auth0 >--------------------
[INFO] Building spring-auth0 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.0.0:clean (default-clean) @ spring-auth0 ---
[INFO] Deleting /Users/takamichi_tatsumoto/study-auth0/spring-auth0/target
[INFO]
[INFO] >>> spring-boot-maven-plugin:2.0.3.RELEASE:run (default-cli) > test-compile @ spring-auth0 >>>
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ spring-auth0 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ spring-auth0 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to /Users/takamichi_tatsumoto/study-auth0/spring-auth0/target/classes
====中略=====
2018-07-06 17:36:32 |main| [DEBUG] org.springframework.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'autoConfigurationReport'
2018-07-06 17:36:32 |main| [DEBUG] org.springframework.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'autoConfigurationReport'
2018-07-06 17:36:32 |main| [DEBUG] org.springframework.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'autoConfigurationReport'
2018-07-06 17:36:32 |main| [DEBUG] org.springframework.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'autoConfigurationReport'
2018-07-06 17:36:32 |main| [DEBUG] org.springframework.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'autoConfigurationReport'
2018-07-06 17:36:32 |main| [DEBUG] org.springframework.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'autoConfigurationReport'
2018-07-06 17:36:32 |main| [DEBUG] org.springframework.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'autoConfigurationReport'
標準出力にdebug levelでlogが出力されています。
prdプロファイルを指定した場合
~/s/spring-auth0 ❯❯❯ mvn clean spring-boot:run -U -Dspring.profiles.active=prd ✘ 10
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< com.mijinco0612:spring-auth0 >--------------------
[INFO] Building spring-auth0 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.0.0:clean (default-clean) @ spring-auth0 ---
[INFO] Deleting /Users/takamichi_tatsumoto/study-auth0/spring-auth0/target
[INFO]
[INFO] >>> spring-boot-maven-plugin:2.0.3.RELEASE:run (default-cli) > test-compile @ spring-auth0 >>>
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ spring-auth0 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ spring-auth0 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to /Users/takamichi_tatsumoto/study-auth0/spring-auth0/target/classes
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ spring-auth0 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/takamichi_tatsumoto/study-auth0/spring-auth0/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ spring-auth0 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/takamichi_tatsumoto/study-auth0/spring-auth0/target/test-classes
[INFO]
[INFO] <<< spring-boot-maven-plugin:2.0.3.RELEASE:run (default-cli) < test-compile @ spring-auth0 <<<
[INFO]
[INFO]
[INFO] --- spring-boot-maven-plugin:2.0.3.RELEASE:run (default-cli) @ spring-auth0 ---
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.3.RELEASE)
標準出力に出力されるのはここまで
tail-f/var/www/logs/spring-auth0.log
2018-07-06 17:39:09 |main| [INFO] org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@780de0b5: startup date [Fri Jul 06 17:39:09 JST 2018]; root of context hierarchy
2018-07-06 17:39:10 |main| [INFO] org.springframework.beans.factory.support.DefaultListableBeanFactory Overriding bean definition for bean 'httpRequestHandlerAdapter' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration; factoryMethodName=httpRequestHandlerAdapter; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration; factoryMethodName=httpRequestHandlerAdapter; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.class]]
2018-07-06 17:39:11 |main| [INFO] org.springframework.boot.web.embedded.tomcat.TomcatWebServer Tomcat initialized with port(s): 28080 (http)
2018-07-06 17:39:12 |main| [INFO] org.apache.catalina.core.StandardService Starting service [Tomcat]
2018-07-06 17:39:12 |main| [INFO] org.apache.catalina.core.StandardEngine Starting Servlet Engine: Apache Tomcat/8.5.31
2018-07-06 17:39:12 |localhost-startStop-1| [INFO] org.apache.catalina.core.AprLifecycleListener The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/takamichi_tatsumoto/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]
2018-07-06 17:39:12 |localhost-startStop-1| [INFO] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] Initializing Spring embedded WebApplicationContext
2018-07-06 17:39:12 |localhost-startStop-1| [INFO] org.springframework.web.context.ContextLoader Root WebApplicationContext: initialization completed in 2344 ms
2018-07-06 17:39:12 |localhost-startStop-1| [INFO] org.springframework.boot.web.servlet.FilterRegistrationBean Mapping filter: 'characterEncodingFilter' to: [/*]
2018-07-06 17:39:12 |localhost-startStop-1| [INFO] org.springframework.boot.web.servlet.FilterRegistrationBean Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-07-06 17:39:12 |localhost-startStop-1| [INFO] org.springframework.boot.web.servlet.FilterRegistrationBean Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-07-06 17:39:12 |localhost-startStop-1| [INFO] org.springframework.boot.web.servlet.FilterRegistrationBean Mapping filter: 'requestContextFilter' to: [/*]
2018-07-06 17:39:12 |localhost-startStop-1| [INFO] org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean Mapping filter: 'springSecurityFilterChain' to: [/*]
2018-07-06 17:39:12 |localhost-startStop-1| [INFO] org.springframework.boot.web.servlet.ServletRegistrationBean Servlet dispatcherServlet mapped to [/]
2018-07-06 17:39:13 |main| [INFO] org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
Using generated security password: c876b0f9-5585-4694-bffc-7930fb15e2fb
2018-07-06 17:39:13 |main| [INFO] org.springframework.security.web.DefaultSecurityFilterChain Creating filter chain: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@480e2604, org.springframework.security.web.context.SecurityContextPersistenceFilter@2845ab1b, org.springframework.security.web.header.HeaderWriterFilter@68d5c82d, org.springframework.security.web.authentication.logout.LogoutFilter@71691f65, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@32a29e56, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1d5f0165, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@378e6eea, org.springframework.security.web.session.SessionManagementFilter@2ff8ec7b, org.springframework.security.web.access.ExceptionTranslationFilter@f408f00, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@2a688901]
2018-07-06 17:39:13 |main| [INFO] org.springframework.web.servlet.handler.SimpleUrlHandlerMapping Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-07-06 17:39:14 |main| [INFO] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@780de0b5: startup date [Fri Jul 06 17:39:09 JST 2018]; root of context hierarchy
2018-07-06 17:39:14 |main| [INFO] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping Mapped "{[/api/v1/public],methods=[GET]}" onto public java.lang.String com.mijinco0612.springauth0.controller.api.v1.DemoController.publicApi()
2018-07-06 17:39:14 |main| [INFO] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping Mapped "{[/api/v1/private],methods=[GET]}" onto public
logback.xmlで指定したディレクトリ(/var/www/logs)にspring-auth0.logというファイルが作成され、そこにinfo levelのlogが出力されています。
まとめ
log出力の設定と環境毎の出し分けが実現できました。