2014-05-09 2 views
3

다음 질문에 대한 해결책을 찾으려고합니다.패키지 종속성 및 초기화

  1. 목표는 모든 로그를 파일에 기록하는 것입니다.
  2. 패키지 본체 수입 패키지 A. 패키지 본체에
  3. 메인 방법에서, 로깅
  4. 패키지 A는 초기화 기능을 갖는 파일을 작성하는 설정이다. A의 init 함수에는 로그 라인 log.Fatal ("I package A")이 있습니다.
  5. 메인 패키지 가져 오기 이후 A의 init 함수가 먼저 호출됩니다 (파일에 기록 할 로그를 설정하기도 전에).

"I 패키지 A"라는 로그가 파일에 쓰여지므로이를 해결하는 방법은 무엇입니까? mainA 모두 가져 당신이 초기화하는 동안 파일에 기록 할 앱 부분에 직접 또는 간접적으로 의존하지 않는 log 패키지 밖으로

답변

3

이동 기록 초기화. Effective Gothe spec의 초기화 순서에 대한 설명에서 로깅이 처음으로 초기화되었는지 확인하는 데 충분해야합니다.

+0

고마워요! 로그 패키지로 추출하면 여러 프로젝트에서 사용하기 때문에 모든 프로젝트에서 액세스 할 수있는 공통 위치에 배치합니다. 그런 다음 로그 패키지의 함수에 매개 변수를 전달하고 로그 할 파일 이름을 설정하려고합니다. 패키지 A가 init 함수에 로깅하고 있기 때문에 문제가 다시 발생하지만 로그에 파일 이름을 설정하면 패키지 A가 이미 기록됩니다. – sat

+0

그래, 각 프로젝트가 자체 로그 위치를 설정하면 loc.-setting 코드가 먼저 실행되어야하며, 어떤 종류의 프로젝트가 프로젝트 당'log' 패키지로 인도되어야합니다. 또는 하나의'log' 패키지가 프로그램 이름 (os.Args [0]) 또는 환경 또는 로그 구성 파일 또는 다른 전역을 기반으로 위치를 선택할 수 있습니다. 슈퍼 미친 짓을하고 싶다면,'log'는 구성 될 때까지'bytes.Buffer' 또는 임시 파일에 로그 할 수 있습니다. 그리고 나서 그 위치가 결정되면 모든 것을 "실제"로그에 복사합니다. 나는 마지막 옵션을 정말로 추천 할 수 없다. 하나의'log' 패키지가 프로젝트 당 파일이나 포크'log'를 선택하도록한다. – twotwotwo

+1

물론입니다. 포인터를 가져 주셔서 감사합니다. 커맨드 라인 인수 나 환경 변수가 갈 길이라고 생각합니다. 모든 프로젝트가 변경 관리 관점에서 매력적이지는 않습니다. 나는 현재의 지식을 가지고 똑같은 것을 짐작할 수 있었을 것이다. 그러나 내가 프로그래밍을하기에는 새로운 것이기 때문에 내가 알지 못했던 쉬운 방법이 있는지 확인하고 싶었다. – sat

0

패키지 A의 초기화 기능이 수행중인 다른 작업에 의존하는 경우 장소 만 다른 곳에 넣을 수있는 장소는 A에 종속 된 패키지의 초기화 기능에 있습니다. 다른 뭔가를 모수화, 당신은 init에서 수동으로 불리는 기능 등

기본적으로, 당신은 할 수 당신이 매개 변수 호출 순서를 제어 할 수있는, (CustomInit 또는 뭔가를 그들에게 전화)로 모두를 이동해야 매개 변수화 된 초기화 함수가 있어야합니다. A의 init 함수가 매개 변수화 된 로깅 객체에 기록하기 때문에 (간접적으로) 매개 변수화되므로 내장 된 init 함수를 사용할 수 없습니다.

+0

우리가 모든 것을 완벽하게 제어 할 수 있다면 제 3 자 패키지로 제어 할 수 있습니다 (모든 패키지의 모든 파일을 조사하고 열어 보지 않는 한). 타사 패키지는 로그 패키지를 사용하여 init 내에서 로그 할 수 있습니다. 제 3 자 패키지가 일반적으로 init 함수에서 로깅하는 것과 같은 일을하지 않는지 여부는 잘 모르겠습니다. 유일한 옵션은 프로젝트 당 로그 패키지 또는 명령 행 인수/env 변수 인 것 같습니다.이런 이상한 상황이 있습니다. – sat

+0

일반적으로 init에서 로깅하는 것은 나쁜 습관이라고 생각합니다. 어쨌든 로깅 할 가치가 없어야하며, 로깅 할 위치를 제어하는 ​​쉬운 방법이 없습니다. init에서 기록한 제 3 자 패키지에 대해서는 의심 스럽습니다. – Evan

관련 문제