시스템을 운영하다가 사고가 발생하면 가장 많은 도움을 받는 것이 바로 Log 파일이다.
Redmine의 경우에도 당연히 Log 파일을 만들어주고 있다.

그런데, 관심을 두지 않고 있어서 별 문제가 없어 보이지만 지금 현재 Log 파일을 살펴보면
엄청난 용량에 무의미한 데이터를 계속 저장하고 있을 수도 있다.


1. Redmine's Log File

   - 기본 경로는 redmine 설치 디렉토리 밑에 ./log/ 에 생성이 된다.
   - 필자의 경우 [ ./log/production.log ] 파일로 생성이 되고 있다.


2. Log contents

   - 아무런 설정 변경 없이 그냥 사용할 경우 어떤 내용이 채워지고 있을까?
   - [ cat ./log/production.log ]

Started GET "/redmine/" for 10.0.2.2 at 2013-04-28 18:31:27 +0900
Processing by WelcomeController#index as HTML
  Current user: anonymous
  Rendered news/_news.html.erb (1.3ms)
  Rendered welcome/index.html.erb within layouts/base (3.0ms)
  Rendered plugins/redmine_banner/app/views/banner/_project_body_bottom.html.erb (0.0ms)
Completed 200 OK in 26ms (Views: 9.5ms | ActiveRecord: 4.3ms)
Started GET "/redmine/login" for 10.0.2.2 at 2013-04-28 18:31:29 +0900
Processing by AccountController#login as HTML
  Current user: anonymous
  Rendered account/login.html.erb within layouts/base (3.6ms)
  Rendered plugins/redmine_banner/app/views/banner/_project_body_bottom.html.erb (0.1ms)
Completed 200 OK in 13ms (Views: 9.7ms | ActiveRecord: 1.5ms)
Started POST "/redmine/login" for 10.0.2.2 at 2013-04-28 18:31:35 +0900
Processing by AccountController#login as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Pe5aTLPaPSNRv6MX244+6cDZBU1JgcOtjdGm9bE3xis=", "back_url"=>"ht$
  Current user: anonymous
Failed login for 'admin' from 10.0.2.2 at 2013-04-28 09:31:35 UTC
  Rendered account/login.html.erb within layouts/base (1.7ms)
  Rendered plugins/redmine_banner/app/views/banner/_project_body_bottom.html.erb (0.1ms)
Completed 200 OK in 8ms (Views: 6.6ms | ActiveRecord: 0.5ms)
Started POST "/redmine/login" for 10.0.2.2 at 2013-04-28 18:31:39 +0900
Processing by AccountController#login as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Pe5aTLPaPSNRv6MX244+6cDZBU1JgcOtjdGm9bE3xis=", "back_url"=>"ht$
  Current user: anonymous
Successful authentication for 'admin' from 10.0.2.2 at 2013-04-28 09:31:39 UTC
Redirected to http://127.0.0.1/redmine/
Completed 302 Found in 6ms (ActiveRecord: 2.8ms)
Started GET "/redmine/" for 10.0.2.2 at 2013-04-28 18:31:39 +0900
Processing by WelcomeController#index as HTML
  Current user: admin (id=1)
  Rendered news/_news.html.erb (2.8ms)
  Rendered welcome/index.html.erb within layouts/base (5.1ms)
  Rendered plugins/redmine_banner/app/views/banner/_project_body_bottom.html.erb (0.0ms)
Completed 200 OK in 19ms (Views: 11.1ms | ActiveRecord: 3.6ms)

   - 에러만 기록되고 있는 것이 아니라 Redmine에서 이루어지는 모든 상황이 전부 기록되고 있는 것을 확인할 수 있다.
   - 그러다보니 Log의 크기를 감당하기가 쉽지가 않다.



3. Guide Document

   - Redmine에서 Log 관련 설정을 어떻게 해야하는지에 대한 내용은 다음에서 확인할 수 있다.
   - http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Logging-configuration

   - Log 파일에 대한 설정을 어떻게 해야하는지 확인하기 위해서 현재 사용하고 있는 Ruby 버전을 확인해보자.

 Environment:
  Redmine version                        2.3.0.stable
  Ruby version                             1.9.3 (i686-linux)
  Rails version                             3.2.13
  Environment                              production
  Database adapter                       PostgreSQL
Redmine plugins:

 $ ruby --version
ruby 1.9.3p392 (2013-02-22 revision 39386) [i686-linux]


   - Ruby v1.9.3 에서 Logger에 대한 도움말은 아래의 주소에서 찾아볼 수 있다.
   - http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html

   - Redmine에서 검색 결과로 나온 document도 있다.
   - http://www.redmine.org/boards/2/topics/25236




4. ./config/addional_environment.rb

   - Redmine의 config 디렉토리에 있는 설정 파일들 중 하나에서 Log에 대한 설정을 할 수 있다.

   - 우선 설정 파일을 만들자.

$ cd ./config/

$ cp ./additional_environment.rb.example ./additional_environment.rb

$ ls
additional_environment.rb          boot.rb                    environment.rb  locales            settings.yml
additional_environment.rb.example  configuration.yml.example  environments    preinitializer.rb
application.rb                     database.yml               initializers    routes.rb

   - 파일 내용을 보면 아래와 같다.

 $ cat ./additional_environment.rb
# Copy this file to additional_environment.rb and add any statements
# that need to be passed to the Rails::Initializer.  `config` is
# available in this context.
#
# Example:
#
#   config.log_level = :debug
#   ...
#

   - 아직은 주석밖에 없다. 그렇다는 말은 지금 현재는 default 설정으로 되어있다는 것이다.

   - 특별한 설정 없는 default 설정은 다음과 같은 값으로 되어있는 것과 같다고 한다.

 config.logger.level = Logger::INFO

   - 로그 파일을 분할을 한다거나 하는 설정은 전혀 없는 것이다. 이 부분에 대한 설정을 해보자.

config.logger = Logger.new('./log/production.log', 5, 1024000)
config.logger.level = Logger::ERROR

   - Logger.new 첫 번째 파라미터는 로그 파일 저장 위치이고,
   - 그 다음은 한 개의 로그 파일의 크기가 약 10MB가 되면 최대 5개로 분할되어 저장을 하라는 의미이다.
   - 로그 파일이 모두 채워지면 처음 만들어진 것부터 차례대로 삭제된다.

   - config.logger.level 에서 사용할 수 있는 옵션은 FATAL, ERROR, WARN, INFO, DEBUG 이다.
   - 기본 설정인 INFO의 경우 너무 많은 정보를 저장하기 때문에, ERROR 정도로 설정을 변경하는 것을 추천한다.


   - 이렇게 파일을 저장하고 Apache2를 재시작하면, 변경된 설정으로 Log가 남겨지게 된다.




결론만 보면 그냥 설정 파일 하나 추가해서 두 줄 추가하는 것 뿐이지만,
이번 기회에 Redmine의 Log에 대해서 정리한다는 생각으로 한 번 살펴봤다는 의미로 생각하면 되겠다.

반응형

'Work Flow'에 대해서 살펴보기 전에,
'Remote Repository'에 존재하는 'branch'와 'Local Repository'에 존재하는 'branch'의 관계에 대해서 알아보겠다.


조금 다른 일반적인(?) 용어로 이야기를 하자면,
서버에서 소스를 가져와서 작업을 하고 있던 중 서버의 내용이 변경이 되어,
이것을 내가 작업하고 있는 곳에 반영을 하고 싶은 경우에 어떻게 할 것인가? 에 대한 설명을 해보고자 한다.


1. branch -a

   - 현재 작업 공간을 한 번 점검해보도록 하겠다.



$ git branch -a


   - 오늘 진행할 내용을 위해서 잡다한 것 모두 지우고, 정리하고, push하고 해 놓았다.

   - 여기서 확인하고 싶은 것은 기본적인 branch의 내역이다. "origin/master"의 존재 !!



2. commit in master branch

   - local에서 즉, master에서 commit을 하나 해보자.



$ nano ./readme.txt
$ git commit -a -m "modify readme.txt in master br"
$ git status


   - 여기에서 잘 살펴볼 부분은 [ git status ]를 했을 때 나오는 메시지이다.
   - "Your branch is ahead of 'origin/master' by 1 commit."
   - 최근의 git은 정말 안내 메시지가 너무 잘 되어 있다~!!! 짱~!!!


3. commit in origin/master

   - remote repository에 commit을 하나 추가된 상황을 만들고자 한다.




$ cd /srv/workspace/2nd
$ git clone {계정}@localhost:/srv/repository/bare1repo
$ cd ./bare1repo


   - 별도의 commit을 만들어 remote에 넣기 위해서 다른 곳에 별도의 local repository를 clone 하자


$ nano ./readme1.txt
$ git commit -a -m "modify readme1.txt in master br, but other master"
$ git push


   - 파일 하나를 수정하고 commit 한 다음에, remote repository로 밀어넣자(push).



4. fetch & merge

   - remote repository의 변경된 내역을 local로 받아오기 위한 작업을 해보자.



$ git fetch
$ git status

   - remote repository의 정보를 얻어오기 위한 명령어는 [ git fetch ]이다.
   - [ git status ]를 해보면 이전과는 또 다른 메시지가 보일 것이다.

   - " Your branch and 'origin/master' have diverged,
        and have 1 and 1 different commit each, respectively. "

   - " diverge " 뜻을 모르는 저같은 분들을 위한 단어의 의미 :
1. (다른 방향으로) 갈라지다   2. 나뉘다, 갈리다   3. (예상・계획 등에서) 벗어나다


$ git merge origin/master

   - [ git log ]를 보면, 위의 그림대로 구성되어진 것을 확인할 수 있을 것이다.




별 것 아닌 것으로 보일 수도 있는데,
git을 혼자서가 아니라 팀으로 작업하는 경우라면 의외로 자주 발생하는 상황일 것이다.

Git에서 보여주는 메시지들을 다시 한 번 잘 살펴보고, 흐름을 잘 느끼고 생각하면 많은 것을 배울 수 있을 것이다.



이런 에잇~ 또 12시를 넘겨버렸네.... ㅠㅠ
오늘 자전거 타이어 바꾸려고 편도 15km가 넘는 거리를 달려갔지만 결국 허탕치고 오늘 자전거만 30km가 넘게 타서...
지금 허리아프고 손목아프고, 목 아프고..... 이런 상황에서 12시를 넘겨버리다니... ㅠㅠ
내일 출근해야하는데.... 흑흑.... 어여 잠자야겠다.

반응형

또 다시 간만에 작성하는 Git 이야기...^^

branch의 경우 설명하는 글들을 읽어도 알기 힘든 부분들이 많다.



오늘 살펴보고자 하는 것은 지난 번 포스팅한 내용 중,
merge를 하게 되면 마지막 commit을 한 내용을 그대로 가져온다고 했었다는 내용에 대해서다.


Git의 branch를 그냥 막 사용한다면 모르겠지만,
하나 하나 그 내용을 분석이 필요하다고 하면 아래 내용을 잘 따라와보면 도움이 될 것이다.



1. 준비

   - 지금 branch를 활용한 작업을 하기 전에 준비를 하자.



 $ git branch -a

   - [ git branch -a ] 명령을 통해 모든 branch 상태에 대해서 알아보자.
   - [ * ] 표시가 되어있는 branch가 지금 현재 작업을 하고 있는 branch이다.


2. branch & commit

   - branch를 하나 만들고, 'master branch'에서 commit을 하나 해보자. 



 $ git branch patch1
 $ nano ./readme.txt
 $ git commit -a -m "nano readme.txt in master br"

   - "A" 시점에서 'patch1 branch'를 생성을 하고,
   - 'master branch'에서 파일 수정 후 commit을 해서 "B" 시점으로 갔다.
   - 그래서 'master branch'는 지금 현재 "B" 위치에 있는 것이다.


3. checkout & commit

   - 작업하고 있는 branch를 바꿔보자.



 $ git checkout patch1

   - [ git checkout patch1 ]을 통해 작업하고 있는 branch를 변경했다.



 $ nano ./readme1.txt
 $ git commit -a -m "nano readme1.txt in patch1 br"

   - 'readme1.txt' 파일을 수정 후 commit 하자.

   - commit을 추가로 한 번 더 해보자.



 $ nano ./readme1.txt
 $ git commit -a -m "1 more, nano readme1.txt in patch1 br"

   - 'patch1 branch'에서 commit 2건을 추가한 것이다.



4. checkout & merge

   - 각 branch 別 상황을 좀 살펴보자.


 $ git branch -a
 $ git log -2
 $ git checkout master
 $ git log -2

   - 'patch1 branch'의 log들과 'master branch'의 log들을 잘 살펴보기 바란다.

   - 이제 merge를 실행해 보자.



 $ git merge patch1
 $ git log -4

   - 위 그림과 스크린샷을 잘 봐야 한다!!! 많은 것들이 녹아 있다.

   - "E" 지점(commit)은 별도로 만든 것이 아니라 'merge'로 만들어진 것이다.
   - 그래서 log를 보면 "Merge branch 'patch1'"이 보일 것이다.

   - 그런데, 또 하나 특이한 것은 'patch1'에서 이루어진 commit까지 모두 따라왔다.
   - 그러면, 'patch1 branch'를 지워버리면 어떻게 될까?


 $ git branch -d patch1

   - 'patch1 branch'를 그냥 지워버리면 어떻게 될까?!
   - 위에서 보는 바와 같이 그냥 'branch'만 지워지고 변화는 없다.


   - branch를 지운다고 하여도 그 branch에서 작업을 했던 commit들은 지워지지 않는다는 말 같은데...
   - merge가 되었다면 의미가 있지만, merge가 없는 상태에서 branch를 지웠다면...
   - 의미 없는 commit들이 그냥 살아있다는 말이 되는데...
   - 이 부분에 대해서는 꼭 한 번 깊이있게 살펴볼 예정이다. 개인적으로 관심있는 부분이라서....^^



여하튼, 이번 포스팅에서 확인을 한 것은,
branch에서 만든 commit들이 merge 후에도 계속 따라온다는 것이다.

commit 하나 하나에 더욱 더 신경을 써야 한다는 결론이 나온다.

반응형

+ Recent posts