반응형

Tomcat의 로그파일중 catalina.out은 하나의 파일에 계속 로그가 누적됨으로

파일의 크기가 무지막지하게 커지는 현상을 볼수있다.

차후 파일의 크기가 일정크기를 벗어났을때 에러도 발생하기때문에 정기적으로 Tomcat을 내리고 삭제해주는 작업을 해야되는

불편함이 있어서 파일을 다른 로그처럼 날짜별로 생성하고 싶었다.


그래서 검색을 했더니 log4j나 몇가지 다른 방법으로 설정하는 방법이 존재하는거 같았다.

하지만 Apache의 rotatelogs를 이용하는게 제일 쉽고 간단해 보였다.


방법은 /Tomcat설치폴더/bin/catalina.sh 파일의 내용중

  shift

  touch "$CATALINA_OUT"

  if [ "$1" = "-security" ] ; then

    if [ $have_tty -eq 1 ]; then

      echo "Using Security Manager"

    fi

    shift

    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \

      -Djava.security.manager \

      -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \

      -Dcatalina.base="\"$CATALINA_BASE\"" \

      -Dcatalina.home="\"$CATALINA_HOME\"" \

      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      >> "$CATALINA_OUT" 2>&1 "&"

  else

    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \

      -Dcatalina.base="\"$CATALINA_BASE\"" \

      -Dcatalina.home="\"$CATALINA_HOME\"" \

      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      >> "$CATALINA_OUT" 2>&1 "&"

  fi

이부분에서 몇가지 부분을 아래와 같이 변경한다.

  shift

  #touch "$CATALINA_OUT"

  if [ "$1" = "-security" ] ; then

    if [ $have_tty -eq 1 ]; then

      echo "Using Security Manager"

    fi

    shift

    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \

      -Djava.security.manager \

      -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \

      -Dcatalina.base="\"$CATALINA_BASE\"" \

      -Dcatalina.home="\"$CATALINA_HOME\"" \

      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      2>&1 "&" | /apache설치위치/bin/rotatelogs "$CATALINA_OUT"-%Y-%m-%d 86400 540 &

  else

    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \

      -Dcatalina.base="\"$CATALINA_BASE\"" \

      -Dcatalina.home="\"$CATALINA_HOME\"" \

      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      2>&1 "&" | /apache설치위치/bin/rotatelogs "$CATALINA_OUT"-%Y-%m-%d 86400 540 &

  fi

위의 빨간색 글자부분이 변경된 부분이다.

우선 touch "$CATALINA_OUT" 부분을 주석처리한다.

주석처리하지 않으면 아래와같이 파일크기가 0인 catalina.out 이라는 파일이 계속 생성되어 있는것을 볼수 있다.

그다음으로 Apache가 설치된 경로를 확인한다.

이는 날짜별 파일 생성을 위해 rotatelogs를 사용하는데 Apache의 설치경로 아래에 bin폴더에 존재하기 때문이다.

그리고 나서

>> "$CATALINA_OUT" 2>&1 "&" 

부분이 두군데 있는데 두군데 모두를 

2>&1 "&" | /apache설치위치/bin/rotatelogs "$CATALINA_OUT"-%Y-%m-%d 86400 540 &

로 변경해준다.


당연히 "apache설치위치"는 실제 위치를 기재해야된다.

그리고 뒷쪽의 옵션이 %Y-%m-%d 86400 540 이렇게 붙는데

%Y-%m-%d는 날짜 표현(상세 표현 방법은 아래 표 참조)

%A

(지역화된) 완전한 요일 이름

%a

(지역화된) 3-문자 요일 이름

%B

(지역화된) 완전한 달 이름

%b

(지역화된) 3-문자 달 이름

%c

(지역화된) 날짜와 시간

%d

2-자리 일

%H

2-자리 시간 (24 시간 시계)

%I

2-자리 시간 (12 시간 시계)

%j

3-자리 날짜수

%M

2-자리 분

%m

2-자리 달

%p

(지역화된) 12 시간 시계의 am/pm

%S

2-자리 초

%U

2-자리 주일수 (주의 첫번재 날은 일요일)

%W

2-자리 주일수 (주의 첫번재 날은 월요일)

%w

1-자리 요일수 (주의 첫번째 날은 일요일)

%X

(지역화된) 시간

%x

(지역화된) 날짜

%Y

4-자리 연도

%y

2-자리 연도

%Z

시간대 이름

%%

문자그대로 `%'

86400는 로테이션 시간을 초단위로 표현 (86400은 24시간 즉 매일)

540은 표준시와 한국시간과의 시간차를 표현


이제 catalina.out 로그는 날짜별로 생성되어 진다.

아래 참고사이트에 가면 더 다양한 설정 방법 및 옵션을 확인 가능하다.

참고 사이트 : http://adminid.kr/unixlinux/102231

                  http://httpd.apache.org/docs/current/programs/rotatelogs.html



출처: http://savour.tistory.com/316 [사랑향기-아이들의 키만큼 커져가는 행복(서진연)]

반응형
반응형


 나는 개발할 때 Chrome 개발자도구의 console을 굉장히 자주 사용하는데(대부분의 개발자들이 그럴 것이라 생각한다), 오늘은 크롬 개발자도구의 편리한 기능과 잘 쓰진 않지만 알아두면 좋은 기능들을 한 번 정리해 보고자 한다.

Console Open

  • Windows / Linux: Ctrl+Shift+J
  • Mac: Cmd+Opt+J
  • 개발자 도구가 열린 상태: ESC

Console Clear

  • clear() 입력
  • Ctrl+L

Log Options

 console 오른쪽 상단위 톱니바퀴를 누르면 옵션을 볼 수 있다. 주로 사용하는 기능은 다음과 같다.

  • Hide network: 404 또는 500 오류 등은 보여주지 않는다.
  • Log XMLHttpRequst: XML Request를 기록
  • Preserve log: refresh나 탐색하는 동안 log기록을 유지
  • Show timestamps: log행 마다 timestamp를 보여 준다.


그룹화하여 console message 출력하기

 console.group(),  console.groupEnd() 명령어를 사용하면 메세지들을 그룹화 하여 보여줄 수 있다. 또한 이 그룹들은 중첩도 가능하다. 또 그룹이 축소된 상태로 보이게 하고 싶다면 console.group()대신 console.Collapsed()를 사용할 수도 있다.

특정 상황에서만 console message 출력하기

 console.assert()를 사용하면 첫번째 매개변수가 false일때만 두번째 매개변수를 출력한다.

CSS로 출력 스타일 변경하기

 %c와 css style을 이용하면 출력되는 색이나 글자 크기를 바꿀 수 있다.

DOM Element를 Javascript 객체로 나타내기

 console로 DOM Element를 출력해보면 보통 다음과 같이 HTML 형식으로 표현되는 것을 볼 수 있다.

 그러나 개발하다보면 해당 element의 속성을 보고싶은 경우가 있는데 이때 console.dir()를 사용하면 해당 element를 javascript객체로 표현해준다.

객체 정보를 표로 보기

 object나 배열을 console.table()을 사용하면 표로 볼 수 있다.

실행 시간 측정 하기

 console.time()과 console.timeEnd()를 사용하면 실행하는데 걸린 시간을 표시해준다. 따로 new Date() 함수등을 사용할 필요가 없어 편리하다.

$_

 $_를 사용하면 가장 마지막으로 사용했던 selector나 평가식을 반환하다.

Shortcut Selector

 console에서 DOM Element를 선택할때 단축 선택자를 사용할 수 있다. 단축 선택자는 세 종류가 있다.

  • $(): 일치하는 첫 번째 요소를 반환, document.querySelector()와 같다.
  • $$(): 일치하는 모든 요소의 배열을 반환, document.querySelectorAll()과 같다.
  • $x(): Xpath와 일치하는 요소의 배열을 반환한다.
  • $0-4: console에서는 마지막으로 불러왔던 요소 5개를 저장해둔다. 가장 최신은 $0, 가장 오래된 항목은 $4이다.

이벤트가 발생 했을 때 콘솔을 출력하고 싶을 때

 monitorEvents(element, eventType)을 사용하면 특정 이벤트가 발생 했을 때 coonsole에 보여줄 수 있다. unmonitorEvents(element)를 사용하면 이벤트 수신을 해제한다. 또 특정 객체에 연결되어있는 eventListener들을 보고싶다면 getEventListeners(element)를 사용하면 된다.

객체를 클립보드에 복사하기

 copy(object)를 사용하면 지정된 객체의 문자열 표현을 클립보드에 복사할 수 있다.

특정 함수가 호출 되었을 때 디버그 실행하기

 debug(function)을 사용하면 해당 함수가 실행되었을때 sources 패널 내부에서 단계적으로 디버그를 할 수 있도록 해준다.

함수에 전달된 인수를 보고 싶을 때

 monitor(function) 함수를 실행하면 지정된 함수가 실행 되었을 때 함수 이름과 인수를 출력해준다.

ES6 Template literals 응용하기

 chrome은 대부분의 ES6 문법을 지원하기 때문에 template literals를 그대로 사용할 수 있는데, console.log와 조합하면 꽤나 편리하게 사용이 가능하다. 특히 문자열과 변수를 함께 사용해야하는 경우 편리하다. 예를 들어보자. 보통 문자열 중간에 변수 값을 표현하려면 다음과 같이 많이 사용한다.

 template literals은 ``(backtick)과 ${object}를 사용하여 표현할 수 있다. 따라서 다음과 같이 console.log()에 다음과 같이 표현할 수 있다.



출처: http://dev-momo.tistory.com/entry/알마두면-쓸만한-Chrome-Console-기능 [Programming Note]

반응형
반응형

안녕하세요. 이번 시간에는 History API에 대해 알아보겠습니다.

제 블로그를 보시면 페이지가 깜빡이지 않는데도 내용도 바뀌고 주소도 바뀝니다. 물론 리액트 기술을 사용하였기 때문에 가능한 일이지만, 실제로는 하나의 페이지로 만들어진 웹입니다. 싱글 페이지 애플리케이션(SPA)이라고 하죠.

SPA의 단점은 주소가 바뀌지 않는다는 것입니다. 초창기에는 주소 뒤에 #(해쉬) #!(해쉬뱅)을 붙이고 뒤에 하위 주소를 넣었습니다. www.zerocho.com/#!/category/javascript처럼요. 하지만 이 방식은 뭔가 찜찜합니다. #!이라는 주소에 무언가 의미가 있는 것도 아니고 이질적인 느낌이 듭니다. 또한 서버는 # 뒷 부분을 제대로 된 주소라고 생각하지 않습니다.

undefined

따라서 해쉬뱅 대신 브라우저에서 제공하는 주소 API를 사용해 주소를 바꾸게 되었습니다. 바로 History API입니다. 요즘 웬만한 SPA의 라우터들은 이 API를 사용하고 있습니다. IE도 10부터 가능합니다.

이 API는 기존 history 객체(window.history)를 그대로 활용합니다. 따라서 자바스크립트로 뒤로가기(history.back())와 앞으로 가기(history.forward()), 지정한 위치로 가기(history.go(인덱스))를 모두 사용할 수 있습니다. 하지만 SPA일 경우를 가정하고 있기 때문에 이번 시간에는 위 메소드는 사용하지 않습니다.

주소 내역은 하나의 목록입니다. 뒤로가기, 앞으로가기는 목록 안에서 이동하는 것입니다. 따라서 목록에 새로운 주소를 추가하면 페이지를 이동한 셈이 됩니다. 목록에 주소를 추가하기 위한 메소드가 HTML5에서 생겼습니다.

바로 history.pushState()와 history.replaceState()입니다. 예제를 보며 사용방법을 익혀봅시다. html 파일을 만들어 다음 코드를 입력하세요. 저는 일부러 book 폴더를 만든 후 그 안에 파일을 생성했습니다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>History API</title>
</head>
<body>
<div id="state"></div>
<button id="pushState">pushState</button>
<button id="replaceState">replaceState</button>
<script>
  document.querySelector('#pushState').addEventListener('click', function () {
    history.pushState({ data: 'pushpush' }, 'title을 pushState로', '/pushpush')
  });
  document.querySelector('#replaceState').addEventListener('click', function () {
    history.replaceState({ data: 'replace' }, 'title을 replaceState로', '/replace');
  });
  window.addEventListener('popstate', function () {
    console.log('popstate', history.state);
    document.querySelector('#state').innerHTML = JSON.stringify(history.state);
  });
</script>
</body>
</html>

undefined

웹스톰을 통해 실행한 것이라 주소가 좀 지저분합니다. 아마 여러분은 그냥 /book/history.html일 것입니다. 

html에 두 개의 버튼이 있습니다. pushState와 replaceState인데요. pushState를 누르면 주소가 바뀝니다. 그리고 뒤로가기 버튼이 활성화됩니다. 페이지는 새로 갱신되지 않았는데 주소만 바뀐 효과가 나타난 것이죠.

undefined

코드를 보시면 pushState 버튼을 눌렀을 때 history.pushState({data:'pushpush'}, 'title을 pushState로', '/pushpush')하도록 되어있습니다. 첫 번째 인자는 바뀐 주소와 함께 저장할 데이터 객체이고, 두 번째 인자는 바꿀 제목, 세 번째 인자는 바꿀 주소입니다. 

주소와 함께 데이터도 저장할 수 있기 때문에 매우 유용합니다. 이 데이터에 바뀔 페이지의 정보들을 담아두고 클라이언트에서 정보를 활용해 새로운 페이지를 렌더링하면 됩니다. 정보는 history.state로 접근할 수 있습니다. 

두 번째 인자는 제목인데 브라우저에서 아직 제목 바꾸는 것까지는 구현하지 않았습니다. 그냥 빈 문자열을 넣어 두는 정도로 하시면 됩니다.

세 번째 인자는 바뀔 주소입니다. 위의 예시에서는 /pushpush를 주었기 때문에 절대 경로로 처리가 되었습니다. 만약 그냥 pushpush나 ./pushpush로 줬다면 상대경로로 처리가 되어 주소가 localhost:63342/book/pushpush가 되었을 것입니다.

뒤로 가기를 누르면 원래 주소로 돌아갑니다. 앞으로가기를 눌러서 /pushpush로 되돌아 갈 수도 있습니다.

원래 주소에서 replaceState를 눌러봅시다.

undefined

이번에는 뒤로가기가 활성화되지 않고 주소만 바꿉니다. pushState와의 차이점을 아시겠나요?

pushState는 주소 목록에 새로운 주소를 추가합니다. /book/history.html을 이전 주소로 두고, 새로운 주소로 /pushpush를 추가한 것입니다. 이전 주소가 남아있기 때문에 뒤로가기로 /book/history.html로 되돌아갈 수 있습니다.

하지만 replaceState는 이전 주소를 없애고 바꿀 주소를 넣습니다. /book/history.html이라는 주소 기록을 지우고 /replace를 추가하는 것입니다. 따라서 /book/history.html에 더는 접근할 수 없습니다.

pushState와 replaceState를 활용하여 프레임워크 없이 싱글 페이지 애플리케이션을 만들어보세요! 페이지 주소에 대한 데이터는 다시 말씀드리지만 history.state에 들어있기 때문에 언제든지 사용할 수 있습니다.

아, pushState와 replaceState로 주소를 바꾼 후, 뒤로가기나 앞으로가기를 했을 때 발생하는 이벤트가 있습니다. 바로 popstate 이벤트입니다. 예제처럼 윈도우에 이벤트 리스너를 연결해 두면 뒤로가기나 앞으로가기를 눌렀을 때 이벤트가 발생합니다. pushState를 여러 번 눌렀다가 뒤로가기를 해보면 #state에 history.state 정보가 뜹니다.

undefined

주의할 점은 pushState와 replaceState를 할 때는 이벤트가 발생하지 않는다는 것입니다. pushState 또는 replaceState를 한 후, 뒤로가기나 앞으로가기를 눌렀을 때만 발생합니다. popstate 이벤트 발생 후 history.state에 접근하면 이전 state를 가져올 수 있습니다. 따라서 이전 페이지도 그 정보들을 활용해 다시 렌더링할 수 있습니다.

History API, 별 거 아니죠? 다만 새로고침을 눌렀을 경우에는 없는 페이지라고 뜨기 때문에 이 부분은 서버사이드 렌더링으로 해결하셔야 합니다. SPA에서 주소를 자연스럽게 바꿀 수 있다는 것은 대단한 장점입니다. 물론 리액트 라우터나 앵귤러 라우터는 이를 이미 활용하고 있지만, 내부 원리를 알았다는 것에 의의를 두시면 됩니다.


출처 : https://www.zerocho.com/category/HTML/post/599d2fb635814200189fe1a7

반응형

+ Recent posts