@@ -23,7 +23,7 @@ msgid ""
23
23
msgstr ""
24
24
"Project-Id-Version : Python 3.13\n "
25
25
"Report-Msgid-Bugs-To : \n "
26
- "POT-Creation-Date : 2025-01-03 14:16 +0000\n "
26
+ "POT-Creation-Date : 2025-01-10 14:17 +0000\n "
27
27
"PO-Revision-Date : 2021-06-28 00:53+0000\n "
28
28
"Last-Translator : Freesand Leo <yuqinju@163.com>, 2025\n "
29
29
"Language-Team : Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n "
@@ -3879,6 +3879,50 @@ msgid ""
3879
3879
" delay = random.random() * 2 + 0.5\n"
3880
3880
" time.sleep(delay)"
3881
3881
msgstr ""
3882
+ "# sender.py\n"
3883
+ "import json\n"
3884
+ "import logging\n"
3885
+ "import logging.handlers\n"
3886
+ "import time\n"
3887
+ "import random\n"
3888
+ "\n"
3889
+ "import pynng\n"
3890
+ "\n"
3891
+ "DEFAULT_ADDR = \" tcp://localhost:13232\" \n"
3892
+ "\n"
3893
+ "class NNGSocketHandler(logging.handlers.QueueHandler):\n"
3894
+ "\n"
3895
+ " def __init__(self, uri):\n"
3896
+ " socket = pynng.Pub0(dial=uri, send_timeout=500)\n"
3897
+ " super().__init__(socket)\n"
3898
+ "\n"
3899
+ " def enqueue(self, record):\n"
3900
+ " # Send the record as UTF-8 encoded JSON\n"
3901
+ " d = dict(record.__dict__)\n"
3902
+ " data = json.dumps(d)\n"
3903
+ " self.queue.send(data.encode('utf-8'))\n"
3904
+ "\n"
3905
+ " def close(self):\n"
3906
+ " self.queue.close()\n"
3907
+ "\n"
3908
+ "logging.getLogger('pynng').propagate = False\n"
3909
+ "handler = NNGSocketHandler(DEFAULT_ADDR)\n"
3910
+ "# 确保进程 ID 在输出内容中\n"
3911
+ "logging.basicConfig(level=logging.DEBUG,\n"
3912
+ " handlers=[logging.StreamHandler(), handler],\n"
3913
+ " format='%(levelname)-8s %(name)10s %(process)6s %(message)s')\n"
3914
+ "levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,\n"
3915
+ " logging.CRITICAL)\n"
3916
+ "logger_names = ('myapp', 'myapp.lib1', 'myapp.lib2')\n"
3917
+ "msgno = 1\n"
3918
+ "while True:\n"
3919
+ " # 随机地选择日志记录器和层级并记录日志\n"
3920
+ " level = random.choice(levels)\n"
3921
+ " logger = logging.getLogger(random.choice(logger_names))\n"
3922
+ " logger.log(level, 'Message no. %5d' % msgno)\n"
3923
+ " msgno += 1\n"
3924
+ " delay = random.random() * 2 + 0.5\n"
3925
+ " time.sleep(delay)"
3882
3926
3883
3927
#: ../../howto/logging-cookbook.rst:2034
3884
3928
msgid ""
@@ -6328,6 +6372,46 @@ msgid ""
6328
6372
"if __name__ == '__main__':\n"
6329
6373
" sys.exit(main())"
6330
6374
msgstr ""
6375
+ "import argparse\n"
6376
+ "import importlib\n"
6377
+ "import logging\n"
6378
+ "import os\n"
6379
+ "import sys\n"
6380
+ "\n"
6381
+ "def main(args=None):\n"
6382
+ " scriptname = os.path.basename(__file__)\n"
6383
+ " parser = argparse.ArgumentParser(scriptname)\n"
6384
+ " levels = ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')\n"
6385
+ " parser.add_argument('--log-level', default='INFO', choices=levels)\n"
6386
+ " subparsers = parser.add_subparsers(dest='command',\n"
6387
+ "
F438
help='Available commands:')\n"
6388
+ " start_cmd = subparsers.add_parser('start', help='Start a service')\n"
6389
+ " start_cmd.add_argument('name', metavar='NAME',\n"
6390
+ " help='Name of service to start')\n"
6391
+ " stop_cmd = subparsers.add_parser('stop',\n"
6392
+ " help='Stop one or more services')\n"
6393
+ " stop_cmd.add_argument('names', metavar='NAME', nargs='+',\n"
6394
+ " help='Name of service to stop')\n"
6395
+ " restart_cmd = subparsers.add_parser('restart',\n"
6396
+ " help='Restart one or more services')\n"
6397
+ " restart_cmd.add_argument('names', metavar='NAME', nargs='+',\n"
6398
+ " help='Name of service to restart')\n"
6399
+ " options = parser.parse_args()\n"
6400
+ " # 分发命令的代码可以全都放在此文件中。 只是出于演示目的,\n"
6401
+ " # 我们将在单独的模块中实现每个命令。\n"
6402
+ " try:\n"
6403
+ " mod = importlib.import_module(options.command)\n"
6404
+ " cmd = getattr(mod, 'command')\n"
6405
+ " except (ImportError, AttributeError):\n"
6406
+ " print('Unable to find the code for command \\ '%s\\ '' % options.command)\n"
6407
+ " return 1\n"
6408
+ " # 这里可以做得更为灵活并从文件或目录加载配置\n"
6409
+ " logging.basicConfig(level=options.log_level,\n"
6410
+ " format='%(levelname)s %(name)s %(message)s')\n"
6411
+ " cmd(options)\n"
6412
+ "\n"
6413
+ "if __name__ == '__main__':\n"
6414
+ " sys.exit(main())"
6331
6415
6332
6416
#: ../../howto/logging-cookbook.rst:3469
6333
6417
msgid ""
@@ -6898,6 +6982,67 @@ msgid ""
6898
6982
" sdata = ''.join(parts)\n"
6899
6983
" return f'{version} {asctime} {hostname} {appname} {procid} {msgid} {sdata} {msg}'"
6900
6984
msgstr ""
6985
+ "import datetime\n"
6986
+ "import logging.handlers\n"
6987
+ "import re\n"
6988
+ "import socket\n"
6989
+ "import time\n"
6990
+ "\n"
6991
+ "class SysLogHandler5424(logging.handlers.SysLogHandler):\n"
6992
<
10000
span class="diff-text-marker">+"\n"
6993
+ " tz_offset = re.compile(r'([+-]\\ d{2})(\\ d{2})$')\n"
6994
+ " escaped = re.compile(r'([\\ ]\"\\\\ ])')\n"
6995
+ "\n"
6996
+ " def __init__(self, *args, **kwargs):\n"
6997
+ " self.msgid = kwargs.pop('msgid', None)\n"
6998
+ " self.appname = kwargs.pop('appname', None)\n"
6999
+ " super().__init__(*args, **kwargs)\n"
7000
+ "\n"
7001
+ " def format(self, record):\n"
7002
+ " version = 1\n"
7003
+ " asctime = datetime.datetime.fromtimestamp(record.created).isoformat()\n"
7004
+ " m = self.tz_offset.match(time.strftime('%z'))\n"
7005
+ " has_offset = False\n"
7006
+ " if m and time.timezone:\n"
7007
+ " hrs, mins = m.groups()\n"
7008
+ " if int(hrs) or int(mins):\n"
7009
+ " has_offset = True\n"
7010
+ " if not has_offset:\n"
7011
+ " asctime += 'Z'\n"
7012
+ " else:\n"
7013
+ " asctime += f'{hrs}:{mins}'\n"
7014
+ " try:\n"
7015
+ " hostname = socket.gethostname()\n"
7016
+ " except Exception:\n"
7017
+ " hostname = '-'\n"
7018
+ " appname = self.appname or '-'\n"
7019
+ " procid = record.process\n"
7020
+ " msgid = '-'\n"
7021
+ " msg = super().format(record)\n"
7022
+ " sdata = '-'\n"
7023
+ " if hasattr(record, 'structured_data'):\n"
7024
+ " sd = record.structured_data\n"
7025
+ " # 这应当是一个字典,其中的键为 SD-ID 而值则为\n"
7026
+ " # 将 PARAM-NAME 映射到 PARAM-VALUE 的字典\n"
7027
+ " # (请参阅 RFC了解其含义)\n"
7028
+ " # 这里没有错误检查 —— 它只是作为演示,你可以\n"
7029
+ " # 调整此代码以在生产环境中使用\n"
7030
+ " parts = []\n"
7031
+ "\n"
7032
+ " def replacer(m):\n"
7033
+ " g = m.groups()\n"
7034
+ " return '\\\\ ' + g[0]\n"
7035
+ "\n"
7036
+ " for sdid, dv in sd.items():\n"
7037
+ " part = f'[{sdid}'\n"
7038
+ " for k, v in dv.items():\n"
7039
+ " s = str(v)\n"
7040
+ " s = self.escaped.sub(replacer, s)\n"
7041
+ " part += f' {k}=\" {s}\" '\n"
7042
+ " part += ']'\n"
7043
+ " parts.append(part)\n"
7044
+ " sdata = ''.join(parts)\n"
7045
+ " return f'{version} {asctime} {hostname} {appname} {procid} {msgid} {sdata} {msg}'"
6901
7046
6902
7047
#: ../../howto/logging-cookbook.rst:3901
6903
7048
msgid ""
0 commit comments