handler에서 encoding을 설정하는데, 각 handler의 아큐먼트(args) 위치에서 encoding 자리에서 설정합니다.

주의할 점은, 테스트 Python 버전은 3.9인데, config파일에 한글(2바이트)문자가 있으면 오류가 발생함.

버전 3.10에는 fileConfig의 아규먼트에 encoding가 추가되었습니다.

 

추가적인 handler의 args 양식은 아래 자료를 참조하세요. 

 

참조자료

 - loggin.config  : https://docs.python.org/ko/3/library/logging.config.html#module-logging.config

 - loggin.handlers:   https://docs.python.org/ko/3/library/logging.handlers.html

 

import logging.config

logging.config.fileConfig('../logging.conf')
logger = logging.getLogger(__name__)

logger.info("테스트 입니다.")

 

내용추가. (2022-03-17)

qualname 설정과 패키지에 대해서

 - 시스템의 패키지가 java처럼 하나로 묶이지 않으면, Log가 일부에서 출력되지 않는 문제가 발생함. Class는 정상적으로 나오는데,  Class가 없는 Util에서 로그가 출력 되지 않음. qualname을 모듈의 package가 다르니(예: util / api / data), 로그하나로 qualname설정으로 비Class 로그는 출력이 되지 않음. 테스트 해보면, 앞 패키지로 제어되는 건 확인됨.

그래서, util / api / data를 JAVA 처럼 sample/util, sample/api, sample/data 로 변경하면, 전체 로그가 출력됨.

 

package를 sample.main / sample.util / sample.api 이렇게 구조를 잡아야 전체를 제어할 수 있다.
qualname=sample 로 설정하면, 모든 로그를 출력할 있다.
logging.config.fileConfig('logging.conf') <-- main 에서 한 번만 호출하면 된다.
logger = logging.getLogger(__name__)  <-- 각 모듈에서 한 번만 호출한다.

 

 

logging.conf 파일 내용입니다.

[loggers]
keys=root, infoLogger

[handlers]
keys=consoleHandler, fileHandler

[formatters]
keys=consoleFormatter, fileFormatter

####################
## logger
####################
[logger_root]
# level=NOTSET
# handlers=
level=DEBUG
handlers=consoleHandler

[logger_infoLogger]
level=DEBUG
handlers=consoleHandler, fileHandler
# package를 sample.main / sample.util / sample.api 이렇게 구조를 잡아야 전체를 제어할 수 있다.
# qualname=sample 로 설정하면, 모든 로그를 출력할 있다.
# logging.config.fileConfig('logging.conf') <-- main 에서 한 번만 호출하면 된다.
# logger = logging.getLogger(__name__)      <-- 각 모듈에서 한 번만 호출한다.
qualname=sample
propagate=0

####################
## handler
####################
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=consoleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
formatter=fileFormatter
# FileHandler(filename, mode='a', encoding=None, delay=False, errors=None)
args=('logfile.log','a','utf8')

####################
## formatter
####################
[formatter_consoleFormatter]
format=%(asctime)s %(name)s [%(levelname)-8s] %(message)s
datefmt=

[formatter_fileFormatter]
format=%(asctime)s %(name)s [%(levelname)-8s] %(message)s
datefmt=

아래는 TimedRotatingFileHandler 에서 args 설정.

[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
formatter=fileFormatter
# TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None)
# when: 'midnight', 'W0'-'W6', D', 'H', 'M'
#    - W0 is monday
args=('logfile.log', 'midnight', 1, 0, 'utf8')
728x90

map(function, iterable, ...)

map은 새로운 리스트를 반환한다.

 

# 1. range를 리스트로 반환한다.
a = list(range(10))
print(a)
# 결과
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


# 2. range를 문자 리스트로 반환한다.
a = list(map(str,range(10)))
print(a)
# 결과
# ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

# 3. float 리스트를 int 리스트로 변환한다.
b = [1.1, 2.6, 3.3]
a = list(map(int, b))
print(a)
# [1, 2, 3]

# 4. 숫자에 달러 기호를 붙여, 문자 리스트를 반환한다.
def converDollar(money):
  return '$' + str(money)

a = list(map(converDollar,range(10)))
print(a)
# ['$0', '$1', '$2', '$3', '$4', '$5', '$6', '$7', '$8', '$9']

# 5. 문자리스트 생성후 구분자 ";"로 Join 처리한다.
a = ";".join(map(str,range(10)))
print(a)
# 결과
# 0;1;2;3;4;5;6;7;8;9

# 6. 리스트를 변수에 할당
a, b = [10, 20]
print(a)
print(b)
# 결과
# 10
# 20

 

728x90

 

SettingWithCopyWarning 경고가 계속 발생할 때 해결방안

 

1) Dataframe의 slice를 복사 후 사용한다.

  # df = df[(df.A > 10) & (df.B < 5)] 아래 구분으로 변경한다.
  df = df[(df.A > 10) & (df.B < 5)].copy()
  df['1/PER'] = 1 / df['PER']

2) 경고를 끈다

import pandas as pd

# 경고를 끈다 (기본값: 'warn')
pd.set_option('mode.chained_assignment',  None)

# 중략...
df = df[(df.A > 10) & (df.B < 5)]
df['1/PER'] = 1 / df['PER']

 

end.

728x90

SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)'))

 

인증서 오류 시 --trusted-host 옵션을 사용한다.

 

$ pip install requests bs4 lxml openpyxl numpy
There was a problem confirming the ssl certificate

$ pip --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --trusted-host pypi.org install requests bs4 lxml openpyxl numpy

 

 

Usage:   
  pip <command> [options]

Commands:
  install               Install packages.
  download          Download packages.
  uninstall            Uninstall packages.
  freeze               Output installed packages in requirements format.
  list                   List installed packages.
  show                Show information about installed packages.
  check               Verify installed packages have compatible dependencies.
  config              Manage local and global configuration.
  search              Search PyPI for packages.
  cache               Inspect and manage pip's wheel cache.
  index               Inspect information available from package indexes.
  wheel              Build wheels from your requirements.
  hash               Compute hashes of package archives.
  completion      A helper command used for command completion.
  debug            Show information useful for debugging.
  help               Show help for commands.

 

General Options:
  -h, --help        Show help.
  --isolated        Run pip in an isolated mode, ignoring environment variables and user configuration.
  -v, --verbose    Give more output. Option is additive, and can be used up to 3 times.     
  -V, --version    Show version and exit.

  --trusted-host <hostname>

   Mark this host or host:port pair as trusted, even though it does not have valid or any HTTPS.

  ... 중략 ...

 

end.

728x90

+ Recent posts