Register
Login
Resources
Docs Blog Datasets Glossary Case Studies Tutorials & Webinars
Product
Data Engine LLMs Platform Enterprise
Pricing Explore
Connect to our Discord channel

logging.rs 2.2 KB

You have to be logged in to leave a comment. Sign In
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  1. use structopt::StructOpt;
  2. use indicatif::ProgressBar;
  3. use log::*;
  4. use std::sync::atomic::{AtomicPtr, Ordering};
  5. use std::ptr;
  6. use std::marker::PhantomData;
  7. use anyhow::Result;
  8. static LOG_PB: AtomicPtr<ProgressBar> = AtomicPtr::new(ptr::null_mut());
  9. /// Progress bar logging context
  10. pub struct LogPBState<'a> {
  11. phantom: PhantomData<&'a str>
  12. }
  13. struct LogEnv {
  14. level: LevelFilter,
  15. progress: &'static AtomicPtr<ProgressBar>
  16. }
  17. impl Log for LogEnv {
  18. fn enabled(&self, metadata: &Metadata) -> bool {
  19. metadata.level() <= self.level
  20. }
  21. fn log(&self, record: &Record) {
  22. let pass = record.level() <= self.level;
  23. if pass {
  24. let pb_ptr = self.progress.load(Ordering::Relaxed);
  25. if pb_ptr.is_null() {
  26. eprintln!("[{:>5}] {}", record.level(), record.args());
  27. } else {
  28. let msg = format!("[{:>5}] {}", record.level(), record.args());
  29. unsafe {
  30. let pb = &*pb_ptr;
  31. pb.println(msg)
  32. }
  33. }
  34. }
  35. }
  36. fn flush(&self) {}
  37. }
  38. fn verbosify(f: LevelFilter) -> LevelFilter {
  39. match f {
  40. LevelFilter::Error => LevelFilter::Warn,
  41. LevelFilter::Warn => LevelFilter::Info,
  42. LevelFilter::Info => LevelFilter::Debug,
  43. LevelFilter::Debug => LevelFilter::Trace,
  44. x => x
  45. }
  46. }
  47. #[derive(StructOpt, Debug)]
  48. pub struct LogOpts {
  49. /// Verbose mode (-v, -vv, -vvv, etc.)
  50. #[structopt(short="v", long="verbose", parse(from_occurrences))]
  51. verbose: usize,
  52. /// Silence output
  53. #[structopt(short="q", long="quiet")]
  54. quiet: bool
  55. }
  56. impl LogOpts {
  57. /// Initialize logging
  58. pub fn init(&self) -> Result<()> {
  59. let mut level = LevelFilter::Info;
  60. if self.quiet {
  61. level = LevelFilter::Off;
  62. }
  63. for _i in 0..self.verbose {
  64. level = verbosify(level);
  65. }
  66. let logger = LogEnv {
  67. level: level,
  68. progress: &LOG_PB
  69. };
  70. set_boxed_logger(Box::new(logger))?;
  71. set_max_level(level);
  72. Ok(())
  73. }
  74. }
  75. pub fn set_progress<'a>(pb: &'a ProgressBar) -> LogPBState<'a> {
  76. let pbb = Box::new(pb.clone());
  77. LOG_PB.store(Box::leak(pbb), Ordering::Relaxed);
  78. LogPBState {
  79. phantom: PhantomData
  80. }
  81. }
  82. impl <'a> Drop for LogPBState<'a> {
  83. fn drop(&mut self) {
  84. LOG_PB.store(ptr::null_mut(), Ordering::Relaxed);
  85. }
  86. }
Tip!

Press p or to see the previous file or, n or to see the next file

Comments

Loading...