기본 콘텐츠로 건너뛰기

keytool 사용법

keytool.exe -genkey -alias juheon -keyalg RSA -keypass 1234qwer -storepass 1234qwer -keystore juheon.jks  keytool.exe -export -alias juheon -storepass 1234qwer -file juheon.cer -keystore juheon.jks  keytool.exe -importkeystore -srckeystore juheon.jks -destkeystore juheon.key.p12 -deststoretype PKCS12  D:\Java\32bit\jdk1.5.0_22\jre\lib\security\cacert  D:\Java\32bit\jdk1.5.0_22\bin\keytool.exe -import -alias tsasample -keystore  D:\Java\32bit\jdk1.5.0_22\jre\lib\security\cacert -file D:\workspace\Servers\tsa-server-web-config\tomcat.cer  keytool -import -alias somansa -keystore C:\Program Files\Java\jdk1.8.0_102\jre\lib\security\cacert -file c:\somansa.cer #인증서 생성  keytool -genkey -alias keyAlias -keyalg RSA -keypass changeit -storepass changeit –validity 9999 -keystore keystore.jks  keytool -export -alias keyAlias -storepass changeit -file server.cer -keystore keystore.jks  keytool -import -v -trustcacerts -alias keyAlias -file server.cer -keystore cacerts.jks -keypass changeit

Spring boot hello world(3)

Logging




Log

가장 많이 알려진 log 프레임웍인 slf4j를 사용하여 로깅한다. slf4j 구현체는 logback 사용.


logback

logback은 core, classic, access가 있는데 core는 classic, access(Servlet Container에서 Http access log으로 사용)에서 사용하는 공통 모듈이다. classic만 추가하면 관련 라이브러리들이 추가되니 최근 릴리즈된 버전중 사람들이 가장 많이 사용하는 버전을 dependency에 추가한다.


dependencies {
...
 compile("ch.qos.logback:logback-classic:1.2.3")
...
}


이글을 적고 테스트 하다보니 Spring Boot은 기본적으로 logger를 logback을 사용한다. 아... 이 등쉰쉑키...

설정이 매우 간편하다. application.properties에 설정 하면 끝!

application.properties

logging.level.org.springframework.web=info
logging.level.org.hibernate=ERROR
logging.level.root=error
logging.level.com.ha.helloworld=info //테스트 할 설정

logging.pattern.console=[%thread] %highlight(%-5level) %d{yyyy-MM-dd HH:mm:ss} - %msg%n



Controller

package com.ha.helloworld.controller;
...
static final Logger logger = LoggerFactory.getLogger(EmployeeController.class);
...

@GetMapping
public ResponseEntity> getAllEmployee() {
    List list = this.employeeService.getAllEmployees();

    logger.info("Result : {}" + list); //테스트 할 로그
  
    ResponseEntity> response = new ResponseEntity<>(list, new HttpHeaders(), HttpStatus.OK);
...



Console

03:09:04.545 [http-nio-80-exec-2] INFO  c.h.h.controller.EmployeeController - Result : {}[Employee[id=1,firstName=Lokesh,lastName=Gupta,email=abc@gmail.com], Employee[id=2,firstName=Deja,lastName=Vu,email=xyz@email.com], Employee[id=3,firstName=Caption,lastName=America,email=cap@marvel.com], Employee[id=4,firstName=juheon,lastName=ha,email=xyz@email.com], Employee[id=6,firstName=juheon,lastName=ha,email=xyz@email.com], Employee[id=7,firstName=juheon,lastName=ha,email=xyz@email.com]
...


붉은 색으로 마킹된 패키지 하위의 모든 클래스 로그 레벨에 대한 설정이다.
logging.level.com.ha.helloworld=info

Logger 구현체인 logback을 이용한 설정인 logback-spring.xml 파일을 생성하여 설정해도 된다. 유의할 점은 application.properties, logback-spring.xml 양쪽에 다 패키지나 그룹에 대한 설정을 하면 동일한 로그가 N개 찍히게 되니 유의.


logback-spring.xml

logback 설절파일이다. classpath경로에 생성하여 필요한 설정들을 한다. 경로를 변경하고 싶다면 application.properties 파일에 "logging.config=classpath:config/log.xml" 와 같이 설정하면된다. 

가장일반적인 설정 샘플

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
  <springProperty scope="context" name="logging.file.path" source="logging.file.path"
        defaultValue="d:/log"/>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>
      <!-- <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> -->
    </encoder>
  </appender>
  
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${logging.file.path}/logFile.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.zip</fileNamePattern>

      <!-- keep 30 days' worth of history capped at 3GB total size -->
      <maxHistory>30</maxHistory>
      <totalSizeCap>3GB</totalSizeCap>

    </rollingPolicy>

    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
  
  <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>ERROR</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
    
    <file>${logging.file.path}/ErrorLogFile.log</file>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>ErrorLogFile.%d{yyyy-MM-dd}.zip</fileNamePattern>

      <!-- keep 30 days' worth of history capped at 3GB total size -->
      <maxHistory>30</maxHistory>
      <totalSizeCap>3GB</totalSizeCap>

    </rollingPolicy>

    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>  

  <root level="info">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
    <appender-ref ref="ERROR_FILE" />
  </root>

  <logger name="com.ha.helloworld.controller" level="debug">
   <appender-ref ref="STDOUT" />
   <appender-ref ref="FILE" />
   <appender-ref ref="ERROR_FILE" />
  </logger>

</configuration>


댓글

이 블로그의 인기 게시물

Tomcat : context.xml 파일 사용

context.xml 파일을 사용하여 JNDI 등록 사용하는 방법 1. server.xml 파일에 JNDI 등록  server.xml 파일의 GlobalNamingResources노드에 Resource를 등록하고 Host 노드 하위 Context 노드에 ResourceLink노드를 등록하여 많이 사용했다. tomcat 5.5 이전 방식이다. server.xml ... <globalnamingresources>     <!-- Editable user database that can also be used by          UserDatabaseRealm to authenticate users     -->     <resource auth="Container" driverclassname="oracle.jdbc.OracleDriver" maxidle="4" maxtotal="8" name="global.db" password="password" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:xe" username="user">   </resource> </globalnamingresources> ... 2. context.xml 파일 분리 위 방식처럼 server.xml 파일에 모든 context의 정보를 추가하는 방식은 서버에 대한 제어권이 없으면 정보를 변경하기 힘들다. Tomcat 5.5? 이후부터는 context.xml 파일을 분리하여 webapplication에서 별도로 자원을 등록 사용할 수있도록 제공한다. META-INF/context.xml 파일을 위치시키면 Tomcat은 구동시 META-INF 폴더의 context.xml 파일을

Jeus was jsp 컴파일된 파일 경로

WAS 구동시 jsp 에러가 났을때 jsp가 컴파일된 파일을 확인하여 디버깅한다. jeus was jsp 컴파일된 파일 경로 %WAS_HOME%/WEBAPP/WEB-INF/.warjspwork/jeus_jspwork/ jsp 에러의 예) javax.servlet.ServletException: String index out of range: -13 at javax.servlet.http.HttpServlet.service(Unknown Source) at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java(Compiled Code)) at jeus.servlet.engine.RequestDispatcherImpl.processCommonRequestDispatcher(RequestDispatcherImpl.java(Compiled Code)) at jeus.servlet.engine.RequestDispatcherImpl.doForward(RequestDispatcherImpl.java(Compiled Code)) at jeus.servlet.engine.RequestDispatcherImpl.forward(RequestDispatcherImpl.java(Compiled Code)) at com.tomato.jef.servlet.BaseServlet.doDispatch(BaseServlet.java(Inlined Compiled Code)) at com.tomato.jef.bizframe.servlet.XecureHTMLMainServlet.doProcess(XecureHTMLMainServlet.java(Compiled Code)) at com.tomato.jef.bizframe.servlet.XecureHTMLMainServlet.doSessionProcess(Xec

Vmware Fusion Window가 정상 종료가 되지 않을때

* 1번 방법   1. VMWare가 실행된 그 상태에서 Option키를 누르고 위에 메뉴바에서 Virtual Machine 메뉴를 클릭합니다.  2. 종료 메뉴가 Force 메뉴로 바뀌어 있습니다. Force shut down 이나 Force restart 합니다.  * 2번 방법   1. 유틸리티 - 활성 상태 보기로 들어가서 vmware 단어가 포함된 모든 프로세스를 강제종료 합니다.    2. 가상머신의 파일을 찾아갑니다. (eg. Documents/Virtual Machines/ 안에 있습니다.) 그리고 가상머신 파일의 오른쪽을 눌러 "패키지 내용 보기"로 들어갑니다.  3. ".vmem" 확장자로 된 모든 파일을 쓰레기통에 버리고 난 후 모두 비웁니다.  4. 다시 VMWare을 실행합니다. 어떤 오류가 나면 그냥 Disgard 하면됩니다.