내배캠 24일차

·2022년 12월 7일
0

내일배움캠프

목록 보기
25/142
post-thumbnail

TODO

  • tiny에디터로 받은 파일(사진)을 db에 저장하는 법
  • logging 시스템?
  • post.html에 유저 이미지가져오기
  • 비밀번호 암호화

logging(로깅)

로깅이란?

운영 중인 웹이 문제가 발생했을 경우, 문제의 언인을 파악하려면 문제가 발생했을 때 당시의 정보가 필요함.
=> 당시의 정보를 얻기 위해서 Exception이 발생했거나, 중요 기능이 실행되는 부분에서는 적절한 로그를 남겨 주는것이 필요.

  • 정보를 제공하는 일련의 기록인 로그를 생성하도록 시스템을 작성하는 활동.
  • print()은 간단한, 보통은 일시적인 로그를 생성하기만 함.
  • 로그가 제공하는 정보의 양은, 이상적으로는 프로그램이 실행되는 중에도 설정 가능해야한다.
  • 일반적인 로그 기록의 이점
    • 로그는 재현하기 힘든 버그에 대한 유용한 정보를 제공할 수 있다.
    • 로그는 성능에 관한 통계와 정보를 제공할 수 있다.
    • 설정이 가능할 때, 로그는 예기치 못한 특정 문제들을 디버그하기 위해, 그 문제들을 처리하도록 코드를 수정하여 다시 적용(deploy)하지 않아도, 일반적인 정보를 갈무리할 수 있게 한다.

로그를 출력하는 법

  1. 로깅 라이브러리 이용
  2. 파이썬 내 로깅함수 사용
수행하려는 작업작업을 위한 도구
명령행 스크립트 또는 프로그램의 일반적인 사용을 위한 콘솔 출력 표시print()
프로그램의 정상 작동 중에 발생하는 이벤트 보고(상태 모니터링이나 결함 조사)logging.info()(또는 진단 목적의 아주 자세한 출력은 logging.debug())
특정 실행시간 이벤트와 관련하여 경고를 발행라이브러리 코드에서 warnings.warn(): 문제를 피할 수 있고 경고를 제거하기 위해 클라이언트 응용 프로그램이 수정되어야 하는 경우, logging.warning(): 클라이언트 응용 프로그램이 할 수 있는 일이 없는 상황이지만 이벤트를 계속 주목해야 하는 경우
특정 실행시간 이벤트와 관련하여 에러를 보고예외를 일으킵니다
예외를 발생시키지 않고 에러의 억제를 보고 (가령 장기 실행 서버 프로세스의 에러 처리기)구체적인 에러와 응용 프로그램 영역에 적절한 logging.error(), logging.exception(), logging.critical()
  • 로깅 함수는 추적되는 이벤트의 수준 또는 심각도를 따라 명명됩니다. 표준 수준과 그 용도는 아래에 설명되어 있습니다 (심각도가 높아지는 순서대로).
수준사용할 때
DEBUG상세한 정보. 보통 문제를 진단할 때만 필요합니다.
INFO예상대로 작동하는지에 대한 확인.
WARNING예상치 못한 일이 발생했거나 가까운 미래에 발생할 문제(예를 들어 ‘디스크 공간 부족’)에 대한 표시. 소프트웨어는 여전히 예상대로 작동합니다.
ERROR더욱 심각한 문제로 인해, 소프트웨어가 일부 기능을 수행하지 못했습니다.
CRITICAL심각한 에러. 프로그램 자체가 계속 실행되지 않을 수 있음을 나타냅니다.
  • 예시
import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
# 로그생성
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

이제 파일을 열고 내용을 살펴본다면, 아래의 로그 메시지를 찾을 수 있습니다:

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

로그 라이브러리 종류

  1. java.util.logging
  • JDK 1.4부터 포함된 표준 로깅 API
  • 별도 라이브러리 추가 불필요
  • 기능이 많이 부족해 다른 로그 라이브러리를 많이 사용
  1. Apache Commons logging
  • 아파치 재단의 Commons 라이브러리 중에 로그 출력을 제공하는 라이브러리
  1. Log4j
  • 아파치 제단에서 제공하며 가장 많이 사용되는 로깅 라이브러리
  1. Logback
  • Log4j를 개발한 Ceki Gulcu가 Log4j의 단점 개선 및 기능을 추가하여 개발한 로깅 라이브러리

참고

파이썬 로깅 시설
파이썬 로깅 HOWTO

오늘의 핵심코드들

이미지경로(app.py)

@app.route('/post/image', methods=['POST'])
def post_image():
    f = request.files['file']
    f.save('static/image/post/' + f.filename)
    url = "static/image/post/" + f.filename
    return jsonify({'url': url})

이미지경로(tiny script내부)

input.onchange = function () {
            var file = this.files[0];
            const formData = new FormData();
            formData.append('file', file);

            $.ajax({
              type:"POST",
              url:"/post/image",
              cache: false,
              contentType: false,
              processData: false,
              data: formData,
              success: function (response) {
                console.log(response['url'])
                cb(response['url'],{title:file.name})
              }
            })
          };

비밀번호암호화(app.py)

  • 회원가입조건을 만족했을경우 실행되는 코드, hash
db = pymysql.connect(
        user='',
        password='',
        host='',
        port=3306,
        database='project2b2',
        charset='utf8'
    )
    curs = db.cursor()

    userId = request.form['id']
    password = request.form['password']
    hash = bcrypt.generate_password_hash(password).decode('utf-8')
    userName = request.form['name']
    email = request.form['email']
    print(hash)

    sql = f'INSERT INTO `user` (id, password, name, email) VALUES("{userId}", "{hash}", "{userName}", "{email}");'

    curs.execute(sql)  # 데이터베이스에 넣어주기 위함
    db.commit()  # 삽입,삭제,수정할때, 최종적으로 데이터베이스를 만져줄때만
    db.close()

    return jsonify({'msg': '회원 가입 성공'})

유저의 이미지받아오기(post.html)

  • 세션을 이용해서 이미지 받아오기
<img
class="profile-image"
src="../static/image/user/{{session['image']}}"
alt="타이틀로고"
/>
profile
개발자 꿈나무

0개의 댓글