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

<!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!(&quot;Executing query: {}&quot;, query);
}
fn main() {
env_logger::init();
execute_query(&quot;DROP TABLE students&quot;);
}
</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: &amp;str) -&gt; Result&lt;(), &amp;'static str&gt; {
Err(&quot;I'm afraid I can't do that&quot;)
}
fn main() {
env_logger::init();
let response = execute_query(&quot;DROP TABLE students&quot;);
if let Err(err) = response {
log::error!(&quot;Failed to execute query: {}&quot;, 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!(&quot;This error has been printed to Stdout&quot;);
}
</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(&amp;self, metadata: &amp;Metadata) -&gt; bool {
metadata.level() &lt;= Level::Info
}
fn log(&amp;self, record: &amp;Record) {
if self.enabled(record.metadata()) {
println!(&quot;Rust says: {} - {}&quot;, record.level(), record.args());
}
}
fn flush(&amp;self) {}
}
fn main() -&gt; Result&lt;(), SetLoggerError&gt; {
log::set_logger(&amp;CONSOLE_LOGGER)?;
log::set_max_level(LevelFilter::Info);
log::info!(&quot;hello log&quot;);
log::warn!(&quot;warning&quot;);
log::error!(&quot;oops&quot;);
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 = &quot;linux&quot;)]
#[cfg(target_os = &quot;linux&quot;)]
use syslog::{Facility, Error};
#[cfg(target_os = &quot;linux&quot;)]
fn main() -&gt; Result&lt;(), Error&gt; {
// 初始化 logger
syslog::init(Facility::LOG_USER,
log::LevelFilter::Debug,
// 可选的应用名称
Some(&quot;My app name&quot;))?;
log::debug!(&quot;this is a debug {}&quot;, &quot;message&quot;);
log::error!(&quot;this is an error!&quot;);
Ok(())
}
#[cfg(not(target_os = &quot;linux&quot;))]
fn main() {
println!(&quot;So far, only Linux systems are supported.&quot;);
}
</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>