1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
# -------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License in the project root for
# license information.
# --------------------------------------------------------------------------
import logging
import threading
from os import makedirs
from os.path import exists, join
from azure.monitor.opentelemetry._utils import (
_EXTENSION_VERSION,
_IS_DIAGNOSTICS_ENABLED,
_env_var_or_default,
_get_customer_ikey_from_env_var,
_get_log_path,
)
from azure.monitor.opentelemetry._version import VERSION
_DIAGNOSTIC_LOGGER_FILE_NAME = "applicationinsights-extension.log"
_SITE_NAME = _env_var_or_default("WEBSITE_SITE_NAME")
_SUBSCRIPTION_ID_ENV_VAR = _env_var_or_default("WEBSITE_OWNER_NAME")
_SUBSCRIPTION_ID = _SUBSCRIPTION_ID_ENV_VAR.split("+")[0] if _SUBSCRIPTION_ID_ENV_VAR else None
_logger = logging.getLogger(__name__)
_logger.propagate = False
_logger.setLevel(logging.DEBUG)
_DIAGNOSTIC_LOG_PATH = _get_log_path()
_DISTRO_DETECTS_ATTACH = "4100"
_INFO = "4101"
_INSTRUMENTATION_SKIPPED = "4101"
_ATTACH_SUCCESS_DISTRO = "4200"
_ATTACH_SUCCESS_CONFIGURATOR = "4201"
_INSTRUMENTATION_SUCCEEDED = "4202"
_DEPENDENCY_OVERLAP = "4300"
_ATTACH_FAILURE_DISTRO = "4400"
_ATTACH_FAILURE_CONFIGURATOR = "4401"
_ATTACH_DETECTS_SDK = "4402"
_INSTRUMENTATION_FAILED = "4403"
class AzureDiagnosticLogging:
_initialized = False
_lock = threading.Lock()
@classmethod
def _initialize(cls):
with AzureDiagnosticLogging._lock:
if not AzureDiagnosticLogging._initialized:
if _IS_DIAGNOSTICS_ENABLED and _DIAGNOSTIC_LOG_PATH:
log_format = (
"{"
+ '"time":"%(asctime)s.%(msecs)03d", '
+ '"level":"%(levelname)s", '
+ '"logger":"%(name)s", '
+ '"message":"%(message)s", '
+ '"properties":{'
+ '"operation":"Startup", '
+ f'"siteName":"{_SITE_NAME}", '
+ f'"ikey":"{_get_customer_ikey_from_env_var()}", '
+ f'"extensionVersion":"{_EXTENSION_VERSION}", '
+ f'"sdkVersion":"{VERSION}", '
+ f'"subscriptionId":"{_SUBSCRIPTION_ID}", '
+ '"msgId":"%(msgId)s", '
+ '"language":"python"'
+ "}"
+ "}"
)
if not exists(_DIAGNOSTIC_LOG_PATH):
makedirs(_DIAGNOSTIC_LOG_PATH)
f_handler = logging.FileHandler(join(_DIAGNOSTIC_LOG_PATH, _DIAGNOSTIC_LOGGER_FILE_NAME))
formatter = logging.Formatter(fmt=log_format, datefmt="%Y-%m-%dT%H:%M:%S")
f_handler.setFormatter(formatter)
_logger.addHandler(f_handler)
AzureDiagnosticLogging._initialized = True
@classmethod
def debug(cls, message: str, message_id: str):
AzureDiagnosticLogging._initialize()
_logger.debug(message, extra={"msgId": message_id})
@classmethod
def info(cls, message: str, message_id: str):
AzureDiagnosticLogging._initialize()
_logger.info(message, extra={"msgId": message_id})
@classmethod
def warning(cls, message: str, message_id: str):
AzureDiagnosticLogging._initialize()
_logger.warning(message, extra={"msgId": message_id})
@classmethod
def error(cls, message: str, message_id: str):
AzureDiagnosticLogging._initialize()
_logger.error(message, extra={"msgId": message_id})
|