1+ #
2+ # Copyright 2025 The InfiniFlow Authors. All Rights Reserved.
3+ #
4+ # Licensed under the Apache License, Version 2.0 (the "License");
5+ # you may not use this file except in compliance with the License.
6+ # You may obtain a copy of the License at
7+ #
8+ # http://www.apache.org/licenses/LICENSE-2.0
9+ #
10+ # Unless required by applicable law or agreed to in writing, software
11+ # distributed under the License is distributed on an "AS IS" BASIS,
12+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+ # See the License for the specific language governing permissions and
14+ # limitations under the License.
15+ #
16+
17+ import os
18+ import os .path
19+ import logging
20+ from logging .handlers import RotatingFileHandler
21+ from common .file_utils import get_project_base_directory
22+
23+ initialized_root_logger = False
24+
25+ def init_root_logger (logfile_basename : str , log_format : str = "%(asctime)-15s %(levelname)-8s %(process)d %(message)s" ):
26+ global initialized_root_logger
27+ if initialized_root_logger :
28+ return
29+ initialized_root_logger = True
30+
31+ logger = logging .getLogger ()
32+ logger .handlers .clear ()
33+ log_path = os .path .abspath (os .path .join (get_project_base_directory (), "logs" , f"{ logfile_basename } .log" ))
34+
35+ os .makedirs (os .path .dirname (log_path ), exist_ok = True )
36+ formatter = logging .Formatter (log_format )
37+
38+ handler1 = RotatingFileHandler (log_path , maxBytes = 10 * 1024 * 1024 , backupCount = 5 )
39+ handler1 .setFormatter (formatter )
40+ logger .addHandler (handler1 )
41+
42+ handler2 = logging .StreamHandler ()
43+ handler2 .setFormatter (formatter )
44+ logger .addHandler (handler2 )
45+
46+ logging .captureWarnings (True )
47+
48+ LOG_LEVELS = os .environ .get ("LOG_LEVELS" , "" )
49+ pkg_levels = {}
50+ for pkg_name_level in LOG_LEVELS .split ("," ):
51+ terms = pkg_name_level .split ("=" )
52+ if len (terms )!= 2 :
53+ continue
54+ pkg_name , pkg_level = terms [0 ], terms [1 ]
55+ pkg_name = pkg_name .strip ()
56+ pkg_level = logging .getLevelName (pkg_level .strip ().upper ())
57+ if not isinstance (pkg_level , int ):
58+ pkg_level = logging .INFO
59+ pkg_levels [pkg_name ] = logging .getLevelName (pkg_level )
60+
61+ for pkg_name in ['peewee' , 'pdfminer' ]:
62+ if pkg_name not in pkg_levels :
63+ pkg_levels [pkg_name ] = logging .getLevelName (logging .WARNING )
64+ if 'root' not in pkg_levels :
65+ pkg_levels ['root' ] = logging .getLevelName (logging .INFO )
66+
67+ for pkg_name , pkg_level in pkg_levels .items ():
68+ pkg_logger = logging .getLogger (pkg_name )
69+ pkg_logger .setLevel (pkg_level )
70+
71+ msg = f"{ logfile_basename } log path: { log_path } , log levels: { pkg_levels } "
72+ logger .info (msg )
73+
74+
75+ def log_exception (e , * args ):
76+ logging .exception (e )
77+ for a in args :
78+ if hasattr (a , "text" ):
79+ logging .error (a .text )
80+ raise Exception (a .text )
81+ else :
82+ logging .error (str (a ))
83+ raise e
0 commit comments