microsoft/openvmm

Public

mirrored fromhttps://github.com/microsoft/openvmmAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
6531c77717c0bab81bc1fec26aa386d69cbe507a

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

support/ci_logger/src/lib.rs

84lines · modecode

1// Copyright (C) Microsoft Corporation. All rights reserved.
2
3//! A [`log::Log`] implementation translates log-levels to ADO logging commands.
4
5use env_logger::filter::Filter;
6use log::Level;
7use log::Metadata;
8use log::Record;
9
10struct AdoLogger {
11 filter: Filter,
12 in_ci: bool,
13}
14
15impl AdoLogger {
16 fn new(log_env_var: &str) -> AdoLogger {
17 let mut builder = env_logger::filter::Builder::new();
18 if let Ok(var) = std::env::var(log_env_var) {
19 builder.parse(&var);
20 } else {
21 builder.filter_level(log::LevelFilter::Info);
22 }
23 let filter = builder.build();
24
25 AdoLogger {
26 in_ci: std::env::var("TF_BUILD").is_ok(),
27 filter,
28 }
29 }
30}
31
32impl log::Log for AdoLogger {
33 fn enabled(&self, metadata: &Metadata<'_>) -> bool {
34 self.filter.enabled(metadata)
35 }
36
37 fn log(&self, record: &Record<'_>) {
38 if self.filter.matches(record) {
39 let (prefix, postfix) = if self.in_ci {
40 let prefix = match record.level() {
41 Level::Error => "##vso[task.logissue type=error]",
42 Level::Warn => "##vso[task.logissue type=warning]",
43 Level::Info => "",
44 Level::Debug => "##[debug]",
45 Level::Trace => "##[debug](trace)",
46 };
47 (prefix, "")
48 } else {
49 let prefix = match record.level() {
50 Level::Error => "\x1B[0;31m", // red
51 Level::Warn => "\x1B[0;33m", // yellow
52 Level::Info => "",
53 Level::Debug => "\x1B[0;36m", // cyan
54 Level::Trace => "\x1B[0;35m", // purple
55 };
56 (prefix, "\x1B[0m")
57 };
58
59 if record.level() <= Level::Info {
60 eprintln!("{}{}{}", prefix, record.args(), postfix)
61 } else {
62 eprintln!(
63 "{}[{}:{}] {}{}",
64 prefix,
65 record.module_path().unwrap_or("?"),
66 record
67 .line()
68 .map(|s| s.to_string())
69 .unwrap_or_else(|| "?".into()),
70 record.args(),
71 postfix
72 )
73 }
74 }
75 }
76
77 fn flush(&self) {}
78}
79
80/// Initialize the ADO logger
81pub fn init(log_env_var: &str) -> Result<(), log::SetLoggerError> {
82 log::set_boxed_logger(Box::new(AdoLogger::new(log_env_var)))
83 .map(|()| log::set_max_level(log::LevelFilter::Trace))
84}
85