(audit_log)= # 감사 로그 Wagtail은 객체에 대해 수행된 작업을 기록하는 메커니즘을 제공합니다. 페이지 생성, 업데이트, 삭제, 잠금 및 잠금 해제, 개정 예약, 개인 정보 변경과 같은 일반적인 활동은 모델 수준에서 자동으로 기록됩니다. Wagtail 관리자는 작업 로그 항목을 사용하여 사이트 전체 및 페이지별 변경 기록을 제공합니다. 기록된 작업에 대한 추가 컨텍스트를 제공하는 '작업' 레지스트리를 사용합니다. 감사 로그 기반 페이지 기록은 개정 목록 페이지를 대체하지만 개정별 항목에 대한 필터를 제공합니다. ```{note} 감사 로그는 개정을 대체하지 않습니다. ``` `wagtail.log_actions.log` 함수를 사용하여 자신의 코드에 로깅을 추가할 수 있습니다. ```{eval-rst} .. function:: log(instance, action, user=None, uuid=None, title=None, data=None) 감사 로그에 항목을 추가합니다. :param instance: 작업이 수행되는 모델 인스턴스 :param action: 수행되는 작업의 코드 이름입니다. 아래 나열된 이름 중 하나이거나 :ref:`register_log_actions` 훅을 통해 정의된 사용자 지정 작업일 수 있습니다. :param user: 선택 사항 - 작업을 시작하는 사용자입니다. 관리자 뷰 내에서 기록된 작업의 경우, 로그인한 사용자로 기본 설정됩니다. :param uuid: 선택 사항 - 동일한 UUID가 지정된 로그 항목은 동일한 사용자 작업의 일부로 발생했음을 나타냅니다(예: 페이지가 생성 시 즉시 게시되는 경우). :param title: 기록되는 인스턴스의 문자열 표현입니다. 기본적으로 Wagtail은 페이지 객체에 대해 인스턴스의\ ``str``\ 표현 또는\ ``get_admin_display_title``\ 을 사용하려고 시도합니다. :param data: 선택 사항 - 로그 항목에 저장할 추가 JSON 직렬화 가능 데이터 사전입니다. ``` ```{note} 로깅을 추가할 때 객체에 발생하는 작업 또는 작업을 기록해야 합니다. 예를 들어, 사용자가 페이지를 생성하고 게시하는 경우 "생성" 항목과 "게시" 항목이 있어야 합니다. 또는 사용자가 게시된 페이지를 복사하고 게시된 상태를 유지하도록 선택하는 경우 새 페이지에 대한 "복사" 및 "게시" 항목이 있어야 합니다. ``` ```python # mypackage/views.py from wagtail.log_actions import log def copy_for_translation(page): # ... page.copy(log_action='mypackage.copy_for_translation') def my_method(request, page): # .. # 수동으로 작업 기록 data = { 'make': {'it': 'so'} } log( instance=page, action='mypackage.custom_action', data=data ) ``` ## Wagtail에서 제공하는 로그 작업 | 작업 | 참고 | | --------------------------------- | -------------------------------------------------------------------------------- | | `wagtail.create` | 객체가 생성되었습니다. | | `wagtail.edit` | 객체가 편집되었습니다 (페이지의 경우 초안으로 저장됨) | | `wagtail.delete` | 객체가 삭제되었습니다. 관리자에게만 사이트 기록에 표시됩니다. | | `wagtail.publish` | 페이지가 게시되었습니다. | | `wagtail.publish.schedule` | 초안이 게시되도록 예약되었습니다. | | `wagtail.publish.scheduled` | `publish_scheduled` 관리 명령을 통해 초안이 게시되었습니다. | | `wagtail.schedule.cancel` | "예약된 게시 취소"를 통해 게시 예정 초안이 취소되었습니다. | | `wagtail.unpublish` | 페이지가 게시 취소되었습니다. | | `wagtail.unpublish.scheduled` | `publish_scheduled` 관리 명령을 통해 페이지가 게시 취소되었습니다. | | `wagtail.lock` | 페이지가 잠겼습니다. | | `wagtail.unlock` | 페이지 잠금이 해제되었습니다. | | `wagtail.rename` | 페이지 이름이 변경되었습니다. | | `wagtail.revert` | 페이지가 이전 초안으로 되돌려졌습니다. | | `wagtail.copy` | 페이지가 새 위치로 복사되었습니다. | | `wagtail.copy_for_translation` | 페이지가 번역을 위해 새 로케일로 복사되었습니다. | | `wagtail.move` | 페이지가 새 위치로 이동되었습니다. | | `wagtail.reorder` | 부모 아래 페이지의 순서가 변경되었습니다. | | `wagtail.view_restriction.create` | 페이지가 제한되었습니다. | | `wagtail.view_restriction.edit` | 페이지 제한이 업데이트되었습니다. | | `wagtail.view_restriction.delete` | 페이지 제한이 제거되었습니다. | | `wagtail.workflow.start` | 워크플로에서 페이지가 중재를 위해 제출되었습니다. | | `wagtail.workflow.approve` | 워크플로 작업에서 초안이 승인되었습니다. | | `wagtail.workflow.reject` | 워크플로 작업에서 초안이 거부되었고 변경이 요청되었습니다. | | `wagtail.workflow.resume` | 초안이 워크플로에 다시 제출되었습니다. | | `wagtail.workflow.cancel` | 워크플로가 취소되었습니다. | ## 로그 컨텍스트 `wagtail.log_actions` 모듈은 가져오기 스크립트와 같이 많은 수의 작업을 기록하는 코드를 단순화하는 컨텍스트 관리자를 제공합니다. ```python from wagtail.log_actions import LogContext with LogContext(user=User.objects.get(username='admin')): # ... log(page, 'wagtail.edit') # ... log(page, 'wagtail.publish') ``` 블록 내의 모든 `log` 호출은 지정된 사용자에게 귀속되며 공통 UUID가 할당됩니다. Wagtail 관리자 내의 뷰에 대해 로그 컨텍스트가 자동으로 생성됩니다. ## 로그 모델 로그는 `wagtail.models.PageLogEntry`(페이지 인스턴스에 대한 작업용) 및 `wagtail.models.ModelLogEntry`(다른 모든 모델에 대한 작업용) 모델을 통해 데이터베이스에 저장됩니다. 페이지 로그는 현재 사용자의 권한에 따라 보고서를 필터링할 수 있도록 자체 모델에 저장됩니다. 이는 일반 외래 키로는 효율적으로 수행할 수 없습니다. 자신의 모델에 `ModelLogEntry` 가 부적합하게 만드는 복잡한 보고 요구 사항이 있는 경우, 자체 로그 모델에 기록되도록 구성할 수 있습니다. 이는 추상 `wagtail.models.BaseLogEntry` 모델을 서브클래싱하고, 로그 레지스트리의 `register_model` 메서드를 사용하여 해당 모델을 등록함으로써 수행됩니다. ```python from myapp.models import Sprocket, SprocketLogEntry # 여기서 SprocketLogEntry는 BaseLogEntry의 서브클래스입니다. @hooks.register('register_log_actions') def sprocket_log_model(actions): actions.register_model(Sprocket, SprocketLogEntry) ```