====== 12 Formatters ====== The //Formatter// class is responsible for converting a Log Record into a String representation. For example, the //FileHandler// uses the function ''Format LogRecord.vi'' of the Formatter class. ===== Available Formatters ===== The HSE Logger ships with three Formatter classes: ==== HSE_v2_Formatter ==== An improved version of the Default Formatter. **Example output:** - Simple error - Error from the Error Cluster from Error Code VI with extra call chain - Error from the Error Cluster from Error Code VI with extra call chain and DQMH error hint 2024-03-05 14:59:32.608 - DEBUG - Normal log message - Logging with Helper-VIs.vi 2024-03-05 15:00:07.338 - DEBUG - Log message with error - Logging with Helper-VIs.vi => Error 42: Some error. 2024-02-20 15:33:58.253 - DEBUG - Log Message - UT_Formatter.lvlib:Test HSE_v2 Format String.vi => Error 42: Some error => Source call chain > Navigation.lvlib:Button Manager.lvclass:Get Object by Name.vi > Navigation.lvlib:Main.vi > Navigation.lvlib:Main.vi.ACBRProxyCaller.724000A7 => DQMH error hint > MHL Frame: Set Disabled State ==== Original Formatter ==== The original, slightly improved format of the FileHandler (//HSE_v1_Formatter//) and default if no specific Formatter is given. **Example output:** - Simple error - Error from the Error Cluster from Error Code VI with extra call chain - Error from the Error Cluster from Error Code VI with extra call chain and DQMH error hint # 2024-02-20 12:46:00.341 - DEBUG - Test error - UT_Formatter.lvlib:Test Clean Source String.vi - 42 - Some error | | # Error from the Error Cluster from Error Code VI with extra call chain 2024-02-20 12:46:00.341 - DEBUG - Test error - UT_Formatter.lvlib:Test Clean Source String.vi - 42 - Some error | UT_Formatter.lvlib:ECFEC Wrapper.vi => UT_Formatter.lvlib:Test Clean Source String.vi | # Error from the Error Cluster from Error Code VI with extra call chain and DQMH error hint 2024-02-20 12:46:00.341 - DEBUG - Test error - UT_Formatter.lvlib:Test Clean Source String.vi - 42 - Some error | Navigation.lvlib:Button Manager.lvclass:Get Object by Name.vi => Navigation.lvlib:Main.vi => Navigation.lvlib:Main.vi.ACBRProxyCaller.724000A7 | MHL Frame: Set Disabled State ==== JSONLFormatter ==== Log in JSON format so that log entries can be parsed by other tools (e.g. fluent-bit log forwarder) without the need to write a custom log parser. **Example JSON lines structured log:** {"time": "2023-10-04 08:55:12.964","log_level": "INFO","message": "Application initialized.","call_chain": "Experiment Pane.lvlib:Main.vi:4140011->Experiment Pane.lvlib:Main.vi.ACBRProxyCaller.C3000E8","error_code": "0"} {"time": "2023-10-04 08:55:12.964","log_level": "DEBUG","message": "Running Self-Tests","call_chain": "Experiment Pane.lvlib:Main.vi:4140011->Experiment Pane.lvlib:Main.vi.ACBRProxyCaller.C3000E8","error_code": "0"} {"time": "2023-10-04 08:55:12.964","log_level": "WARNING","message": "Self-Test A failed","call_chain": "Experiment Pane.lvlib:Main.vi:4140011->Experiment Pane.lvlib:Main.vi.ACBRProxyCaller.C3000E8","error_code": "1234"} {"time": "2023-10-04 08:55:12.964","log_level": "ERROR","message": "VISA Could not load resource.","call_chain": "Experiment Pane.lvlib:Main.vi:4140011->Experiment Pane.lvlib:Main.vi.ACBRProxyCaller.C3000E8","error_code": "5678"} **Features:** * Follows JSONlines format - https://jsonlines.org/ * One log entry per line * Each log entry is JSON formatted * Each line is separated by line feed * Can expand single-line JSON using built in formatters in most text IDEs (i.e. VSCode, Shift+Alt+F) * Scalable - can easily include nested JSON structures ---- ===== Custom Formatter ===== You can implement your own, specific child class of the Default Formatter to adjust the conversion. To inject a Formatter use the corresponding terminal of the "Create Handler" method or the ''Set Formatter.vi'' of the Handler (or the property node). Only Handlers which produce a formatted string output support Formatters. {{:code:open-source:hse-logger:screenshot_2024-03-05_144409.png|}}