You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
16 KiB
83 lines
16 KiB
1 year ago
|
<!doctype html><html lang=zh-CN class="sidebar-visible no-js light"><meta charset=UTF-8><title>日志 - Rusty Book(锈书)</title><meta content="text/html; charset=utf-8" http-equiv=Content-Type><meta name=description content=""><meta name=viewport content="width=device-width,initial-scale=1"><meta name=theme-color content=#ffffff><link rel=icon href=../favicon.svg><link rel="shortcut icon" href=../favicon.png><link rel=stylesheet href=../css/variables.css><link rel=stylesheet href=../css/general.css><link rel=stylesheet href=../css/chrome.css><link rel=stylesheet href=../css/print.css media=print><link rel=stylesheet href=../FontAwesome/css/font-awesome.css><link rel=stylesheet href=../fonts/fonts.css><link rel=stylesheet href=../highlight.css><link rel=stylesheet href=../tomorrow-night.css><link rel=stylesheet href=../ayu-highlight.css><link rel=stylesheet href=../theme/style1.css><body><script>var path_to_root="../",default_theme=window.matchMedia("(prefers-color-scheme: dark)").matches?"navy":"light"</script><script>try{var theme=localStorage.getItem("mdbook-theme"),sidebar=localStorage.getItem("mdbook-sidebar");theme.startsWith('"')&&theme.endsWith('"')&&localStorage.setItem("mdbook-theme",theme.slice(1,theme.length-1)),sidebar.startsWith('"')&&sidebar.endsWith('"')&&localStorage.setItem("mdbook-sidebar",sidebar.slice(1,sidebar.length-1))}catch(e){}</script><script>var theme;try{theme=localStorage.getItem("mdbook-theme")}catch(e){}null==theme&&(theme=default_theme);var html=document.querySelector("html");html.classList.remove("no-js"),html.classList.remove("light"),html.classList.add(theme),html.classList.add("js")</script><script>var html=document.querySelector("html"),sidebar="hidden";if(document.body.clientWidth>=1080){try{sidebar=localStorage.getItem("mdbook-sidebar")}catch(e){}sidebar=sidebar||"visible"}html.classList.remove("sidebar-visible"),html.classList.add("sidebar-"+sidebar)</script><nav id=sidebar class=sidebar aria-label="Table of contents"><div class=sidebar-scrollbox><ol class=chapter><li class="chapter-item expanded affix"><a href=../about.html>Rusty Book</a><li class="chapter-item expanded affix"><li class=part-title>Awesome<li class=spacer><li class="chapter-item expanded"><a href=../daily-dev.html>日常开发常用库</a><li class="chapter-item expanded"><a href=../superstar.html>Rust 明星项目</a><li class="chapter-item expanded"><a href=../empowering-js.html>使用 Rust 增强 JS</a><li class="chapter-item expanded"><a href=../games.html>Rust开发的游戏</a><li class="chapter-item expanded"><a href=../gamedev.html>游戏引擎</a><li class="chapter-item expanded affix"><li class=part-title>Awesome + Cookbook<li class=spacer><li class="chapter-item expanded"><a href=../algos/awesome.html>实用算法</a><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../algos/randomness.html>生成随机值</a><li class="chapter-item expanded"><a href=../algos/sorting.html>Vec 排序</a><li class="chapter-item expanded"><div>压缩算法</div><a class=toggle><div>❱</div></a><li><ol class=section><li class=chapter-item><a href=../algos/compression/tar.html>使用.tar包</a></ol><li class="chapter-item expanded"><div>密码学</div><a class=toggle><div>❱</div></a><li><ol class=section><li class=chapter-item><a href=../algos/cryptography/hashing.html>哈希</a><li class=chapter-item><a href=../algos/cryptography/encryption.html>加密</a></ol><li class="chapter-item expanded"><div>数学计算</div><a class=toggle><div>❱</div></a><li><ol class=section><li class=chapter-item><a href=../algos/math/linear-algebra.html>线性代数</a><li class=chapter-item><a href=../algos/math/trigonometry.html>三角函数</a><li class=chapter-item><a href=../algos/math/complex.html>复数</a><li class=chapter-item><a href=../algos/math/statistics.html>统计学</a><li class=chapter-item><a href=../algos/math/misc.html>杂项</a></ol></ol><li class="chapter-item expanded"><a href=../datastructures/awesome.html>数据结构</a><a class=toggle><div>❱</div></a><li><ol cl
|
||
|
log::debug!("Executing query: {}", query);
|
||
|
}
|
||
|
|
||
|
fn main() {
|
||
|
env_logger::init();
|
||
|
|
||
|
execute_query("DROP TABLE students");
|
||
|
}
|
||
|
</code></pre></pre><p>如果大家运行代码,会发现没有任何日志输出,原因是默认的日志级别是 <code>error</code>,因此我们需要通过 <code>RUST_LOG</code> 环境变量来设置下新的日志级别:<pre><code class=language-shell>$ RUST_LOG=debug cargo run
|
||
|
</code></pre><p>然后你将成功看到以下输出:<pre><code class=language-shell>DEBUG:main: Executing query: DROP TABLE students
|
||
|
</code></pre><h3 id=将错误日志输出到控制台><a class=header href=#将错误日志输出到控制台>将错误日志输出到控制台</a></h3><p>下面我们通过 <a href=https://docs.rs/log/0.4.16/log/macro.error.html>log::error!</a> 将错误日志输出到标准错误 <code>stderr</code>。<pre><pre class=playground><code class="language-rust edition2021">fn execute_query(_query: &str) -> Result<(), &'static str> {
|
||
|
Err("I'm afraid I can't do that")
|
||
|
}
|
||
|
|
||
|
fn main() {
|
||
|
env_logger::init();
|
||
|
|
||
|
let response = execute_query("DROP TABLE students");
|
||
|
if let Err(err) = response {
|
||
|
log::error!("Failed to execute query: {}", err);
|
||
|
}
|
||
|
}
|
||
|
</code></pre></pre><h3 id=将错误输出到标准输出-stdout><a class=header href=#将错误输出到标准输出-stdout>将错误输出到标准输出 stdout</a></h3><p>默认的错误会输出到标准错误输出 <code>stderr</code>,下面我们通过自定的配置来让错误输出到标准输出 <code>stdout</code>。<pre><pre class=playground><code class="language-rust editable edition2021">use env_logger::{Builder, Target};
|
||
|
|
||
|
fn main() {
|
||
|
Builder::new()
|
||
|
.target(Target::Stdout)
|
||
|
.init();
|
||
|
|
||
|
log::error!("This error has been printed to Stdout");
|
||
|
}
|
||
|
</code></pre></pre><h3 id=使用自定义-logger><a class=header href=#使用自定义-logger>使用自定义 logger</a></h3><p>下面的代码将实现一个自定义 logger <code>ConsoleLogger</code>,输出到标准输出 <code>stdout</code>。为了使用日志宏,<code>ConsoleLogger</code> 需要实现 <a href=https://docs.rs/log/*/log/trait.Log.html>log::Log</a> 特征,然后使用 <a href=https://docs.rs/log/*/log/fn.set_logger.html>log::set_logger</a> 来安装使用。<pre><pre class=playground><code class="language-rust editable edition2021">use log::{Record, Level, Metadata, LevelFilter, SetLoggerError};
|
||
|
|
||
|
static CONSOLE_LOGGER: ConsoleLogger = ConsoleLogger;
|
||
|
|
||
|
struct ConsoleLogger;
|
||
|
|
||
|
impl log::Log for ConsoleLogger {
|
||
|
fn enabled(&self, metadata: &Metadata) -> bool {
|
||
|
metadata.level() <= Level::Info
|
||
|
}
|
||
|
|
||
|
fn log(&self, record: &Record) {
|
||
|
if self.enabled(record.metadata()) {
|
||
|
println!("Rust says: {} - {}", record.level(), record.args());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn flush(&self) {}
|
||
|
}
|
||
|
|
||
|
fn main() -> Result<(), SetLoggerError> {
|
||
|
log::set_logger(&CONSOLE_LOGGER)?;
|
||
|
log::set_max_level(LevelFilter::Info);
|
||
|
|
||
|
log::info!("hello log");
|
||
|
log::warn!("warning");
|
||
|
log::error!("oops");
|
||
|
Ok(())
|
||
|
}
|
||
|
</code></pre></pre><h3 id=输出到-unix-syslog><a class=header href=#输出到-unix-syslog>输出到 Unix syslog</a></h3><p>下面的代码将使用 <a href=https://docs.rs/crate/syslog/6.0.1>syslog</a> 包将日志输出到 <a href=https://www.gnu.org/software/libc/manual/html_node/Overview-of-Syslog.html>Unix Syslog</a>.<pre><pre class=playground><code class="language-rust editable edition2021">#[cfg(target_os = "linux")]
|
||
|
#[cfg(target_os = "linux")]
|
||
|
use syslog::{Facility, Error};
|
||
|
|
||
|
#[cfg(target_os = "linux")]
|
||
|
fn main() -> Result<(), Error> {
|
||
|
// 初始化 logger
|
||
|
syslog::init(Facility::LOG_USER,
|
||
|
log::LevelFilter::Debug,
|
||
|
// 可选的应用名称
|
||
|
Some("My app name"))?;
|
||
|
log::debug!("this is a debug {}", "message");
|
||
|
log::error!("this is an error!");
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
#[cfg(not(target_os = "linux"))]
|
||
|
fn main() {
|
||
|
println!("So far, only Linux systems are supported.");
|
||
|
}
|
||
|
</code></pre></pre><h2 id=tracing><a class=header href=#tracing>tracing</a></h2><p>@todo<div id=giscus-container></div></main><nav class=nav-wrapper aria-label="Page navigation"><a rel=prev href=../datetime/parsing.html class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts=Left><i class="fa fa-angle-left"></i> </a><a rel=next href=../devtools/config-log.html class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts=Right><i class="fa fa-angle-right"></i></a><div style=clear:both></div></nav></div></div><nav class=nav-wide-wrapper aria-label="Page navigation"><a rel=prev href=../datetime/parsing.html class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts=Left><i class="fa fa-angle-left"></i> </a><a rel=next href=../devtools/config-log.html class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts=Right><i class="fa fa-angle-right"></i></a></nav></div><script>window.playground_copyable=!0</script><script src=../ace.js charset=utf-8></script><script src=../editor.js charset=utf-8></script><script src=../mode-rust.js charset=utf-8></script><script src=../theme-dawn.js charset=utf-8></script><script src=../theme-tomorrow_night.js charset=utf-8></script><script src=../elasticlunr.min.js charset=utf-8></script><script src=../mark.min.js charset=utf-8></script><script src=../searcher.js charset=utf-8></script><script src=../clipboard.min.js charset=utf-8></script><script src=../highlight.js charset=utf-8></script><script src=../book.js charset=utf-8></script><script>var pagePath="devtools/log.md"</script><script src=../assets/custom1.js></script><script src=../assets/bigPicture.js></script>
|