From 5ce116e4d1d3c30537f3635c06d7a0c619e55e43 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Tue, 1 Feb 2022 11:35:10 -0500 Subject: Add support for structured logging --- python/log.py | 58 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 15 deletions(-) (limited to 'python/log.py') diff --git a/python/log.py b/python/log.py index 98aef1eb..d5a5f3e6 100644 --- a/python/log.py +++ b/python/log.py @@ -18,9 +18,12 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. +from typing import Optional, Union, Any + # Binary Ninja components from . import _binaryninjacore as core from .enums import LogLevel +import threading _output_to_log = False @@ -35,7 +38,7 @@ def is_output_redirected_to_log(): return _output_to_log -def log(level, text): +def log(level: LogLevel, text: Union[str, Any], logger: Optional[str]="", session:int=0): """ ``log`` writes messages to the log console for the given log level. @@ -55,10 +58,10 @@ def log(level, text): """ if not isinstance(text, str): text = str(text) - core.BNLogString(level, text) + core.BNLogString(session, level, logger, threading.current_thread().ident, text) -def log_debug(text): +def log_debug(text: Union[str, Any], logger: Optional[str]=""): """ ``log_debug`` Logs debugging information messages to the console. @@ -72,10 +75,10 @@ def log_debug(text): """ if not isinstance(text, str): text = str(text) - core.BNLogString(LogLevel.DebugLog, text) + core.BNLogString(0, LogLevel.DebugLog, logger, threading.current_thread().ident, text) -def log_info(text): +def log_info(text: Union[str, Any], logger: Optional[str]=""): """ ``log_info`` Logs general information messages to the console. @@ -89,10 +92,10 @@ def log_info(text): """ if not isinstance(text, str): text = str(text) - core.BNLogString(LogLevel.InfoLog, text) + core.BNLogString(0, LogLevel.InfoLog, logger, threading.current_thread().ident, text) -def log_warn(text): +def log_warn(text: Union[str, Any], logger: Optional[str]=""): """ ``log_warn`` Logs message to console, if run through the GUI it logs with **Warning** icon. @@ -107,10 +110,10 @@ def log_warn(text): """ if not isinstance(text, str): text = str(text) - core.BNLogString(LogLevel.WarningLog, text) + core.BNLogString(0, LogLevel.WarningLog, logger, threading.current_thread().ident, text) -def log_error(text): +def log_error(text: Union[str, Any], logger: Optional[str]=""): """ ``log_error`` Logs message to console, if run through the GUI it logs with **Error** icon, focusing the error console. @@ -125,10 +128,10 @@ def log_error(text): """ if not isinstance(text, str): text = str(text) - core.BNLogString(LogLevel.ErrorLog, text) + core.BNLogString(0, LogLevel.ErrorLog, logger, threading.current_thread().ident, text) -def log_alert(text): +def log_alert(text: Union[str, Any], logger: Optional[str]=""): """ ``log_alert`` Logs message console and to a pop up window if run through the GUI. @@ -143,10 +146,10 @@ def log_alert(text): """ if not isinstance(text, str): text = str(text) - core.BNLogString(LogLevel.AlertLog, text) + core.BNLogString(0, LogLevel.AlertLog, logger, threading.current_thread().ident, text) -def log_to_stdout(min_level=LogLevel.InfoLog): +def log_to_stdout(min_level: Optional[LogLevel]=LogLevel.InfoLog): """ ``log_to_stdout`` redirects minimum log level to standard out. @@ -163,7 +166,7 @@ def log_to_stdout(min_level=LogLevel.InfoLog): core.BNLogToStdout(min_level) -def log_to_stderr(min_level): +def log_to_stderr(min_level: LogLevel): """ ``log_to_stderr`` redirects minimum log level to standard error. @@ -173,7 +176,7 @@ def log_to_stderr(min_level): core.BNLogToStderr(min_level) -def log_to_file(min_level, path, append=False): +def log_to_file(min_level: LogLevel, path: str, append: bool=False): """ ``log_to_file`` redirects minimum log level to a file named ``path``, optionally appending rather than overwriting. @@ -192,3 +195,28 @@ def close_logs(): :rtype: None """ core.BNCloseLogs() + + +class Logger: + def __init__(self, session_id:int, logger_name:str): + self.session_id = session_id + self.logger_name = logger_name + self.handle = core.BNLogCreateLogger(logger_name, session_id) + + def log(self, level:LogLevel, message:str) -> None: + log(level, message, self.logger_name, self.session_id) + + def log_debug(self, message:str) -> None: + log(LogLevel.DebugLog, message, self.logger_name, self.session_id) + + def log_info(self, message:str) -> None: + log(LogLevel.InfoLog, message, self.logger_name, self.session_id) + + def log_warn(self, message:str) -> None: + log(LogLevel.WarningLog, message, self.logger_name, self.session_id) + + def log_error(self, message:str) -> None: + log(LogLevel.ErrorLog, message, self.logger_name, self.session_id) + + def log_alert(self, message:str) -> None: + log(LogLevel.AlertLog, message, self.logger_name, self.session_id) \ No newline at end of file -- cgit v1.3.1