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
<!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 class=section><li class="chapter-item expanded"><a href=../datastructures/bitfield.html>位字段</a></ol><li class="chapter-item expanded"><a href=../cmd/awesome.html>命令行</a><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../cmd/parsing.html>参数解析</a><li class="chapter-item expanded"><a href=../cmd/ansi.html>终端输出格式化</a></ol><li class="chapter-item expanded"><a href=../os/awesome.html>操作系统</a><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../os/processor.html>处理器</a><li class="chapter-item expanded"><a href=../os/command.html>调用系统命令</a></ol><li class="chapter-item expanded"><div>并发</div><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../cocurrency/threads.html>线程</a><li class="chapter-item expanded"><a href=../cocurrency/parallel.html>使用rayon并行处理数据</a></ol><li class="chapter-item expanded"><div>数据库</div><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../database/sqlite.html>SQLite</a><li class="chapter-item expanded"><a href=../database/postgres.html>Postgres</a></ol><li class="chapter-item expanded"><div>日期和时间</div><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../datetime/duration.html>时间计算和转换</a><li class="chapter-item expanded"><a href=../datetime/parsing.html>解析和显示</a></ol><li class="chapter-item expanded"><div>开发者工具</div><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../devtools/log.html class=active>日志</a><li class="chapter-item expanded"><a href=../devtools/config-log.html>配置日志</a><li class="chapter-item expanded"><a href=../devtools/version.html>版本号</a><li class="chapter-item expanded"><a href=../devtools/build-tools.html>构建时工具</a></ol><li class="chapter-item expanded"><div>编解码</div><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../encoding/strings.html>字符编码</a><li class="chapter-item expanded"><a href=../encoding/csv.html>CSV</a><li class="chapter-item expanded"><a href=../encoding/structured.html>结构化数据</a></ol><li class="chapter-item expanded"><div>错误处理</div><li class="chapter-item expanded"><div>文件操作</div><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../files/read-write.html>文件读写</a><li class="chapter-item expanded"><a href=../files/dir.html>目录访问</a></ol><li class="chapter-item expanded"><div>内存管理</div><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../memory/global-vars.html>全局变量</a></ol><li class="chapter-item expanded"><div>网络协议</div><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../protocols/tcpip.html>TCP/IP</a></ol><li class="chapter-item expanded"><div>文本处理</div><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../text/regex.html>正则表达式</a><li class="chapter-item expanded"><a href=../text/string.html>字符串解析</a></ol></ol></div><div id=sidebar-resize-handle class=sidebar-resize-handle></div></nav><div id=page-wrapper class=page-wrapper><div class=page><div id=menu-bar-hover-placeholder></div><div id=menu-bar class="menu-bar sticky bordered"><div class=left-buttons><button id=sidebar-toggle class=icon-button type=button title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls=sidebar><i class="fa fa-bars"></i></button> <button id=theme-toggle class=icon-button type=button title="Change theme" aria-label="Change theme" aria-haspopup=true aria-expanded=false aria-controls=theme-list><i class="fa fa-paint-brush"></i></button><ul id=theme-list class=theme-popup aria-label=Themes role=menu><li role=none><button role=menuitem class=theme id=light>Light (default)</button><li role=none><button role=menuitem class=theme id=rust>Rust</button><li role=none><button role=menuitem class=theme id=coal>Coal</button><li role=none><button role=menuitem class=theme id=navy>Navy</button><li role=none><button role=menuitem class=theme id=ayu>Ayu</button></ul><button id=search-toggle class=icon-button type=button title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded=false aria-keyshortcuts=S aria-controls=searchbar><i class="fa fa-search"></i></button></div><h1 class=menu-title>Rusty Book(锈书)</h1><div class=right-buttons><a href=../print.html title="Print this book" aria-label="Print this book"><i id=print-button class="fa fa-print"></i> </a><a href=https://github.com/studyrs/rusty-book title="Git repository" aria-label="Git repository"><i id=git-repository-button class="fa fa-github"></i> </a><a href=https://github.com/studyrs/rusty-book/edit/main/src/devtools/log.md title="Suggest an edit" aria-label="Suggest an edit"><i id=git-edit-button class="fa fa-edit"></i></a></div></div><div id=search-wrapper class=hidden><form id=searchbar-outer class=searchbar-outer><input type=search id=searchbar name=searchbar placeholder="Search this book ..." aria-controls=searchresults-outer aria-describedby=searchresults-header></form><div id=searchresults-outer class="searchresults-outer hidden"><div id=searchresults-header class=searchresults-header></div><ul id=searchresults></ul></div></div><script>document.getElementById("sidebar-toggle").setAttribute("aria-expanded","visible"===sidebar),document.getElementById("sidebar").setAttribute("aria-hidden","visible"!==sidebar),Array.from(document.querySelectorAll("#sidebar a")).forEach((function(e){e.setAttribute("tabIndex","visible"===sidebar?0:-1)}))</script><div id=content class=content><div class=sidetoc><nav class=pagetoc></nav></div><main><h1 id=日志><a class=header href=#日志>日志</a></h1><h2 id=log-包><a class=header href=#log-包>log 包</a></h2><p><a href=https://docs.rs/crate/log/0.4.16>log</a> 提供了日志相关的实用工具。<h3 id=在控制台打印-debug-信息><a class=header href=#在控制台打印-debug-信息>在控制台打印 debug 信息</a></h3><p><code>env_logger</code> 通过环境变量来配置日志。<a href=https://docs.rs/log/0.4.16/log/macro.debug.html>log::debug!</a> 使用起来跟 <a href=https://doc.rust-lang.org/std/fmt/ >std::fmt</a> 中的格式化字符串很像。<pre><pre class=playground><code class="language-rust edition2021">fn execute_query(query: &str) {
|
|
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>
|