Skip to content

Commit 9d02f17

Browse files
authored
Merge pull request #54 from lambda-sh/vmarcella/improve-logging
lambda-rs-logging
2 parents dd57eda + 9adc779 commit 9d02f17

File tree

29 files changed

+587
-126
lines changed

29 files changed

+587
-126
lines changed

Cargo.lock

Lines changed: 8 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
members = [
55
"crates/lambda-rs",
66
"crates/lambda-rs-args",
7+
"crates/lambda-rs-logging",
78
"crates/lambda-rs-platform",
89
"tools/obj_loader"
910
]
1011

1112
default-members = [
1213
"crates/lambda-rs",
1314
"crates/lambda-rs-args",
15+
"crates/lambda-rs-logging",
1416
"crates/lambda-rs-platform",
1517
"tools/obj_loader"
1618
]

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ and can be added to your project by adding the following to your
5757

5858
```toml
5959
[dependencies]
60-
lambda-rs = "2023.1.29"
60+
lambda-rs = "2023.1.30"
6161
```
6262

6363
or from the CLI:
@@ -158,6 +158,7 @@ cargo run --example triangles
158158
- ### Packages
159159
- [x] (WIP) [lambda-rs-args](./crates/lambda-rs-args/README.md) -- Command line argument parsing.
160160
- [x] (WIP) [lambda-rs-platform](./crates/lambda-rs-platform/README.md) -- Dependency wrappers & platform support.
161+
- [x] [lambda-rs-logging](./crates/lambda-rs-logging/README.md) -- Lightweight Logging API for lambda-rs packages.
161162
- [x] (WIP) [lambda-rs](./crates/lambda-rs/README.md) -- The public Lambda API.
162163
- ### Examples
163164
- [x] Minimal -- A minimal example of an application with a working window
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "lambda-rs-logging"
3+
description = "Logging support for lambda-rs"
4+
version = "2023.1.30"
5+
edition = "2021"
6+
license = "MIT"
7+
8+
[lib]
9+
name = "logging"
10+
path = "src/lib.rs"

crates/lambda-rs-logging/README.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# lambda-rs-logging
2+
![lambda-rs](https://img.shields.io/crates/d/lambda-rs-logging)
3+
![lambda-rs](https://img.shields.io/crates/v/lambda-rs-logging)
4+
5+
A simple logger implementation for lamba-rs crates. Inspired by
6+
python's [logging](https://docs.python.org/3/library/logging.html) module.
7+
8+
9+
# Installation
10+
First, add the following to your `Cargo.toml`:
11+
```toml
12+
[dependencies]
13+
lambda-rs-logging = "2023.1.30"
14+
```
15+
16+
or run this command from your project directory:
17+
```bash
18+
cargo add lambda-rs-logging
19+
```
20+
21+
# Getting started
22+
## Using the global logger
23+
```rust
24+
use logging;
25+
26+
fn main() {
27+
logging::trace!("Hello world");
28+
logging::debug!("Hello world");
29+
logging::info!("Hello world");
30+
logging::warn!("Hello world");
31+
logging::error!("Hello world");
32+
logging::fatal!("Hello world");
33+
}
34+
```
35+
36+
## Using an instance of the logger
37+
```rust
38+
use logging::Logger;
39+
40+
fn main() {
41+
let logger = Logger::new("my-logger");
42+
logger.trace("Hello world");
43+
logger.debug("Hello world");
44+
logger.info("Hello world");
45+
logger.warn("Hello world");
46+
logger.error("Hello world");
47+
logger.fatal("Hello world");
48+
}
49+
```
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
//! Log handling implementations for the logger.
2+
3+
use std::{
4+
fmt::Debug,
5+
fs::OpenOptions,
6+
io::Write,
7+
time::SystemTime,
8+
};
9+
10+
use crate::LogLevel;
11+
12+
pub trait Handler {
13+
fn trace(&mut self, message: String);
14+
fn debug(&mut self, message: String);
15+
fn info(&mut self, message: String);
16+
fn warn(&mut self, message: String);
17+
fn error(&mut self, message: String);
18+
fn fatal(&mut self, message: String);
19+
}
20+
21+
/// A handler that logs to a file.
22+
23+
#[derive(Debug, Clone, PartialEq, PartialOrd)]
24+
pub struct FileHandler {
25+
file: String,
26+
log_buffer: Vec<String>,
27+
}
28+
29+
impl FileHandler {
30+
pub fn new(file: String) -> Self {
31+
Self {
32+
file,
33+
log_buffer: Vec::new(),
34+
}
35+
}
36+
37+
/// Logs a message to the file.
38+
fn log(&mut self, log_level: LogLevel, message: String) {
39+
let timestamp = SystemTime::now()
40+
.duration_since(SystemTime::UNIX_EPOCH)
41+
.unwrap()
42+
.as_secs();
43+
44+
let log_message = format!("[{}]-[{:?}]: {}", timestamp, log_level, message);
45+
46+
let colored_message = match log_level {
47+
LogLevel::TRACE => format!("\x1B[37m{}\x1B[0m", log_message),
48+
LogLevel::DEBUG => format!("\x1B[35m{}\x1B[0m", log_message),
49+
LogLevel::INFO => format!("\x1B[32m{}\x1B[0m", log_message),
50+
LogLevel::WARN => format!("\x1B[33m{}\x1B[0m", log_message),
51+
LogLevel::ERROR => format!("\x1B[31;1m{}\x1B[0m", log_message),
52+
LogLevel::FATAL => format!("\x1B[31;1m{}\x1B[0m", log_message),
53+
};
54+
55+
self.log_buffer.push(colored_message);
56+
57+
// Flush buffer every ten messages.
58+
if self.log_buffer.len() < 10 {
59+
return;
60+
}
61+
62+
let log_message = self.log_buffer.join("\n");
63+
64+
let mut file = OpenOptions::new()
65+
.append(true)
66+
.create(true)
67+
.open(self.file.clone())
68+
.unwrap();
69+
70+
file
71+
.write_all(log_message.as_bytes())
72+
.expect("Unable to write data");
73+
74+
self.log_buffer.clear();
75+
}
76+
}
77+
78+
impl Handler for FileHandler {
79+
fn trace(&mut self, message: String) {
80+
self.log(LogLevel::TRACE, message)
81+
}
82+
83+
fn debug(&mut self, message: String) {
84+
self.log(LogLevel::DEBUG, message)
85+
}
86+
87+
fn info(&mut self, message: String) {
88+
self.log(LogLevel::INFO, message)
89+
}
90+
91+
fn warn(&mut self, message: String) {
92+
self.log(LogLevel::WARN, message)
93+
}
94+
95+
fn error(&mut self, message: String) {
96+
self.log(LogLevel::ERROR, message)
97+
}
98+
99+
fn fatal(&mut self, message: String) {
100+
self.log(LogLevel::FATAL, message)
101+
}
102+
}
103+
104+
#[derive(Debug, Clone, PartialEq, PartialOrd)]
105+
pub struct ConsoleHandler {
106+
name: String,
107+
}
108+
109+
impl ConsoleHandler {
110+
pub fn new(name: &str) -> Self {
111+
return Self {
112+
name: name.to_string(),
113+
};
114+
}
115+
116+
fn log(&mut self, log_level: LogLevel, message: String) {
117+
let timestamp = SystemTime::now()
118+
.duration_since(SystemTime::UNIX_EPOCH)
119+
.unwrap()
120+
.as_secs();
121+
122+
let log_message = format!(
123+
"[{}]-[{:?}]-[{}]: {}",
124+
timestamp, log_level, self.name, message
125+
);
126+
127+
let colored_message = match log_level {
128+
LogLevel::TRACE => format!("\x1B[37m{}\x1B[0m", log_message),
129+
LogLevel::DEBUG => format!("\x1B[35m{}\x1B[0m", log_message),
130+
LogLevel::INFO => format!("\x1B[32m{}\x1B[0m", log_message),
131+
LogLevel::WARN => format!("\x1B[33m{}\x1B[0m", log_message),
132+
LogLevel::ERROR => format!("\x1B[31;1m{}\x1B[0m", log_message),
133+
LogLevel::FATAL => format!("\x1B[31;1m{}\x1B[0m", log_message),
134+
};
135+
136+
println!("{}", colored_message);
137+
}
138+
}
139+
140+
impl Handler for ConsoleHandler {
141+
fn trace(&mut self, message: String) {
142+
self.log(LogLevel::TRACE, message);
143+
}
144+
145+
fn debug(&mut self, message: String) {
146+
self.log(LogLevel::DEBUG, message);
147+
}
148+
149+
fn info(&mut self, message: String) {
150+
self.log(LogLevel::INFO, message);
151+
}
152+
153+
fn warn(&mut self, message: String) {
154+
self.log(LogLevel::WARN, message);
155+
}
156+
157+
fn error(&mut self, message: String) {
158+
self.log(LogLevel::ERROR, message);
159+
}
160+
161+
fn fatal(&mut self, message: String) {
162+
self.log(LogLevel::FATAL, message);
163+
}
164+
}

0 commit comments

Comments
 (0)