From b830b446f164b832b7830f356037e7e08be3d274 Mon Sep 17 00:00:00 2001 From: Greg Price Date: Tue, 12 Dec 2017 16:45:57 -0800 Subject: [PATCH] logging: Reduce `create_logger` to new `log_to_file`. The name `create_logger` suggests something much bigger than what this function actually does -- the logger doesn't any more or less exist after the function is called than before. Its one real function is to send logs to a specific file. So, pull out that logic to an appropriately-named function just for it. We already use `logging.getLogger` in a number of places to simply get a logger by name, and the old `create_logger` callsites can do the same. --- analytics/lib/counts.py | 6 ++-- zerver/decorator.py | 6 ++-- zerver/lib/digest.py | 6 ++-- zerver/lib/logging_util.py | 30 ++++++------------- zerver/lib/send_email.py | 6 ++-- zerver/lib/soft_deactivation.py | 6 ++-- zerver/management/commands/deliver_email.py | 7 +++-- .../commands/enqueue_digest_emails.py | 6 ++-- .../commands/sync_ldap_user_data.py | 6 ++-- 9 files changed, 40 insertions(+), 39 deletions(-) diff --git a/analytics/lib/counts.py b/analytics/lib/counts.py index a1f079d9f0..33cf679ac8 100644 --- a/analytics/lib/counts.py +++ b/analytics/lib/counts.py @@ -1,6 +1,7 @@ import time from collections import OrderedDict, defaultdict from datetime import datetime, timedelta +import logging from typing import Any, Callable, Dict, List, \ Optional, Text, Tuple, Type, Union @@ -11,7 +12,7 @@ from django.db.models import F from analytics.models import Anomaly, BaseCount, \ FillState, InstallationCount, RealmCount, StreamCount, \ UserCount, installation_epoch, last_successful_fill -from zerver.lib.logging_util import create_logger +from zerver.lib.logging_util import log_to_file from zerver.lib.timestamp import ceiling_to_day, \ ceiling_to_hour, floor_to_hour, verify_UTC from zerver.models import Message, Realm, RealmAuditLog, \ @@ -19,7 +20,8 @@ from zerver.models import Message, Realm, RealmAuditLog, \ ## Logging setup ## -logger = create_logger('zulip.management', settings.ANALYTICS_LOG_PATH) +logger = logging.getLogger('zulip.management') +log_to_file(logger, settings.ANALYTICS_LOG_PATH) # You can't subtract timedelta.max from a datetime, so use this instead TIMEDELTA_MAX = timedelta(days=365*1000) diff --git a/zerver/decorator.py b/zerver/decorator.py index bcafa395fd..9458b80460 100644 --- a/zerver/decorator.py +++ b/zerver/decorator.py @@ -31,7 +31,7 @@ from io import BytesIO import urllib from typing import Union, Any, Callable, Sequence, Dict, Optional, TypeVar, Text, Tuple, cast -from zerver.lib.logging_util import create_logger +from zerver.lib.logging_util import log_to_file # This is a hack to ensure that RemoteZulipServer always exists even # if Zilencer isn't enabled. @@ -45,8 +45,8 @@ else: ViewFuncT = TypeVar('ViewFuncT', bound=Callable[..., HttpResponse]) ReturnT = TypeVar('ReturnT') -## logger setup -webhook_logger = create_logger("zulip.zerver.webhooks", settings.API_KEY_ONLY_WEBHOOK_LOG_PATH) +webhook_logger = logging.getLogger("zulip.zerver.webhooks") +log_to_file(webhook_logger, settings.API_KEY_ONLY_WEBHOOK_LOG_PATH) class _RespondAsynchronously: pass diff --git a/zerver/lib/digest.py b/zerver/lib/digest.py index 4bc228af16..dec213915b 100644 --- a/zerver/lib/digest.py +++ b/zerver/lib/digest.py @@ -2,6 +2,7 @@ from typing import Any, Callable, Dict, Iterable, List, Set, Tuple, Text from collections import defaultdict import datetime +import logging import pytz from django.db.models import Q, QuerySet @@ -17,9 +18,10 @@ from zerver.models import UserProfile, UserMessage, Recipient, Stream, \ Realm from zerver.context_processors import common_context from zerver.lib.queue import queue_json_publish -from zerver.lib.logging_util import create_logger +from zerver.lib.logging_util import log_to_file -logger = create_logger(__name__, settings.DIGEST_LOG_PATH) +logger = logging.getLogger(__name__) +log_to_file(logger, settings.DIGEST_LOG_PATH) VALID_DIGEST_DAY = 1 # Tuesdays DIGEST_CUTOFF = 5 diff --git a/zerver/lib/logging_util.py b/zerver/lib/logging_util.py index e17d5ce8ef..2b350cdbaa 100644 --- a/zerver/lib/logging_util.py +++ b/zerver/lib/logging_util.py @@ -185,24 +185,12 @@ class ZulipFormatter(logging.Formatter): setattr(record, 'zulip_decorated', True) return super().format(record) -def create_logger(name: str, - log_file: str, - log_format: str="%(asctime)s%(levelname)-8s%(message)s") -> Logger: - """Creates a named logger for use in logging content to a certain - file. A few notes: - - * "name" is used in determining what gets logged to which files; - see "loggers" in zproject/settings.py for details. Don't use `""` - -- that's the root logger. - * "log_file" should be declared in zproject/settings.py in ZULIP_PATHS. - - """ - logger = logging.getLogger(name) - - if log_file: - formatter = logging.Formatter(log_format) - file_handler = logging.FileHandler(log_file) - file_handler.setFormatter(formatter) - logger.addHandler(file_handler) - - return logger +def log_to_file(logger: Logger, + filename: str, + log_format: str="%(asctime)s%(levelname)-8s%(message)s", + ) -> None: + """Note: `filename` should be declared in zproject/settings.py in ZULIP_PATHS.""" + formatter = logging.Formatter(log_format) + handler = logging.FileHandler(filename) + handler.setFormatter(formatter) + logger.addHandler(handler) diff --git a/zerver/lib/send_email.py b/zerver/lib/send_email.py index 22e7b61d10..3ba2ca94f5 100644 --- a/zerver/lib/send_email.py +++ b/zerver/lib/send_email.py @@ -8,16 +8,18 @@ from zerver.models import UserProfile, ScheduledEmail, get_user_profile_by_id, \ import datetime from email.utils import parseaddr, formataddr +import logging import ujson import os from typing import Any, Dict, Iterable, List, Mapping, Optional, Text -from zerver.lib.logging_util import create_logger +from zerver.lib.logging_util import log_to_file ## Logging setup ## -logger = create_logger('zulip.send_email', settings.EMAIL_LOG_PATH) +logger = logging.getLogger('zulip.send_email') +log_to_file(logger, settings.EMAIL_LOG_PATH) class FromAddress: SUPPORT = parseaddr(settings.ZULIP_ADMINISTRATOR)[1] diff --git a/zerver/lib/soft_deactivation.py b/zerver/lib/soft_deactivation.py index 6208c58635..1468884d7d 100644 --- a/zerver/lib/soft_deactivation.py +++ b/zerver/lib/soft_deactivation.py @@ -1,6 +1,7 @@ -from zerver.lib.logging_util import create_logger +from zerver.lib.logging_util import log_to_file from collections import defaultdict +import logging from django.db import transaction from django.db.models import Max from django.conf import settings @@ -10,7 +11,8 @@ from typing import DefaultDict, List, Union, Any from zerver.models import UserProfile, UserMessage, RealmAuditLog, \ Subscription, Message, Recipient, UserActivity, Realm -logger = create_logger("zulip.soft_deactivation", settings.SOFT_DEACTIVATION_LOG_PATH) +logger = logging.getLogger("zulip.soft_deactivation") +log_to_file(logger, settings.SOFT_DEACTIVATION_LOG_PATH) def filter_by_subscription_history(user_profile: UserProfile, all_stream_messages: DefaultDict[int, List[Message]], diff --git a/zerver/management/commands/deliver_email.py b/zerver/management/commands/deliver_email.py index ae8cd1e6b0..e6d99d6f80 100644 --- a/zerver/management/commands/deliver_email.py +++ b/zerver/management/commands/deliver_email.py @@ -9,7 +9,7 @@ condition. (Alternatively, you can set `EMAIL_DELIVERER_DISABLED=True` on all but one machine to make the command have no effect.) """ - +import logging import time from typing import Any @@ -19,12 +19,13 @@ from django.utils.timezone import now as timezone_now from ujson import loads from zerver.lib.context_managers import lockfile -from zerver.lib.logging_util import create_logger +from zerver.lib.logging_util import log_to_file from zerver.lib.send_email import EmailNotDeliveredException, send_email from zerver.models import ScheduledEmail ## Setup ## -logger = create_logger(__name__, settings.EMAIL_DELIVERER_LOG_PATH) +logger = logging.getLogger(__name__) +log_to_file(logger, settings.EMAIL_DELIVERER_LOG_PATH) class Command(BaseCommand): help = """Deliver emails queued by various parts of Zulip diff --git a/zerver/management/commands/enqueue_digest_emails.py b/zerver/management/commands/enqueue_digest_emails.py index 9a16133866..b72f25bb14 100644 --- a/zerver/management/commands/enqueue_digest_emails.py +++ b/zerver/management/commands/enqueue_digest_emails.py @@ -1,4 +1,5 @@ import datetime +import logging from typing import Any, List from django.conf import settings @@ -6,10 +7,11 @@ from django.core.management.base import BaseCommand from django.utils.timezone import now as timezone_now from zerver.lib.digest import DIGEST_CUTOFF, enqueue_emails -from zerver.lib.logging_util import create_logger +from zerver.lib.logging_util import log_to_file ## Logging setup ## -logger = create_logger(__name__, settings.DIGEST_LOG_PATH) +logger = logging.getLogger(__name__) +log_to_file(logger, settings.DIGEST_LOG_PATH) class Command(BaseCommand): help = """Enqueue digest emails for users that haven't checked the app diff --git a/zerver/management/commands/sync_ldap_user_data.py b/zerver/management/commands/sync_ldap_user_data.py index fc49d548f6..f6c6b10871 100644 --- a/zerver/management/commands/sync_ldap_user_data.py +++ b/zerver/management/commands/sync_ldap_user_data.py @@ -1,16 +1,18 @@ +import logging from typing import Any from django.conf import settings from django.core.management.base import BaseCommand from django.db.utils import IntegrityError -from zerver.lib.logging_util import create_logger +from zerver.lib.logging_util import log_to_file from zerver.models import UserProfile from zproject.backends import ZulipLDAPUserPopulator ## Setup ## -logger = create_logger(__name__, settings.LDAP_SYNC_LOG_PATH) +logger = logging.getLogger(__name__) +log_to_file(logger, settings.LDAP_SYNC_LOG_PATH) # Run this on a cronjob to pick up on name changes. def sync_ldap_user_data() -> None: