Apply code review suggestions. Rename decorating_pipe to logging_pipe. Add plugin_id to plugin log. Move logger init from file to in-code initialization and change logging file to zellij directory. Change format of timestamp.
This commit is contained in:
parent
a38c176646
commit
b15cfba6e1
14 changed files with 143 additions and 123 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -4,5 +4,4 @@
|
||||||
.vim
|
.vim
|
||||||
.DS_Store
|
.DS_Store
|
||||||
/assets/man/zellij.1
|
/assets/man/zellij.1
|
||||||
**/target
|
**/target
|
||||||
zellij.log
|
|
||||||
82
Cargo.lock
generated
82
Cargo.lock
generated
|
|
@ -46,9 +46,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyhow"
|
name = "anyhow"
|
||||||
version = "1.0.41"
|
version = "1.0.42"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "15af2628f6890fe2609a3b91bef4c83450512802e59489f9c1cb1fa5df064a61"
|
checksum = "595d3cfa7a60d4555cb5067b99f07142a08ea778de5cf993f7b75c7d8fabc486"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arc-swap"
|
name = "arc-swap"
|
||||||
|
|
@ -105,12 +105,11 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-io"
|
name = "async-io"
|
||||||
version = "1.4.1"
|
version = "1.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4bbfd5cf2794b1e908ea8457e6c45f8f8f1f6ec5f74617bf4662623f47503c3b"
|
checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"concurrent-queue",
|
"concurrent-queue",
|
||||||
"fastrand",
|
|
||||||
"futures-lite",
|
"futures-lite",
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
|
|
@ -211,12 +210,12 @@ checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "atty"
|
name = "atty"
|
||||||
version = "0.2.11"
|
version = "0.2.14"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
|
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"hermit-abi",
|
||||||
"libc",
|
"libc",
|
||||||
"termion",
|
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -308,9 +307,9 @@ checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.0.68"
|
version = "1.0.69"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787"
|
checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
|
|
@ -589,9 +588,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "darling"
|
name = "darling"
|
||||||
version = "0.12.4"
|
version = "0.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c"
|
checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"darling_core",
|
"darling_core",
|
||||||
"darling_macro",
|
"darling_macro",
|
||||||
|
|
@ -599,9 +598,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "darling_core"
|
name = "darling_core"
|
||||||
version = "0.12.4"
|
version = "0.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36"
|
checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"fnv",
|
"fnv",
|
||||||
"ident_case",
|
"ident_case",
|
||||||
|
|
@ -613,9 +612,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "darling_macro"
|
name = "darling_macro"
|
||||||
version = "0.12.4"
|
version = "0.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a"
|
checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"darling_core",
|
"darling_core",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
@ -674,18 +673,18 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "enumset"
|
name = "enumset"
|
||||||
version = "1.0.6"
|
version = "1.0.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fbd795df6708a599abf1ee10eacc72efd052b7a5f70fdf0715e4d5151a6db9c3"
|
checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"enumset_derive",
|
"enumset_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "enumset_derive"
|
name = "enumset_derive"
|
||||||
version = "0.5.4"
|
version = "0.5.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e19c52f9ec503c8a68dc04daf71a04b07e690c32ab1a8b68e33897f255269d47"
|
checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"darling",
|
"darling",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
|
|
@ -980,9 +979,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "instant"
|
name = "instant"
|
||||||
version = "0.1.9"
|
version = "0.1.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
|
checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
]
|
]
|
||||||
|
|
@ -1070,9 +1069,9 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.97"
|
version = "0.2.98"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "12b8adadd720df158f4d70dfe7ccc6adb0472d7c55ca83445f6a5ab3e36f8fb6"
|
checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libloading"
|
name = "libloading"
|
||||||
|
|
@ -1354,9 +1353,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ordered-float"
|
name = "ordered-float"
|
||||||
version = "2.5.1"
|
version = "2.7.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f100fcfb41e5385e0991f74981732049f9b896821542a219420491046baafdc2"
|
checksum = "039f02eb0f69271f26abe3202189275d7aa2258b903cb0281b5de710a2570ff3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
|
|
@ -1925,9 +1924,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "structopt"
|
name = "structopt"
|
||||||
version = "0.3.21"
|
version = "0.3.22"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c"
|
checksum = "69b041cdcb67226aca307e6e7be44c8806423d83e018bd662360a93dabce4d71"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
|
|
@ -1936,9 +1935,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "structopt-derive"
|
name = "structopt-derive"
|
||||||
version = "0.4.14"
|
version = "0.4.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90"
|
checksum = "7813934aecf5f51a54775e00068c237de98489463968231a51746bbbc03f9c10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck",
|
"heck",
|
||||||
"proc-macro-error",
|
"proc-macro-error",
|
||||||
|
|
@ -2050,18 +2049,18 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "1.0.25"
|
version = "1.0.26"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6"
|
checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "1.0.25"
|
version = "1.0.26"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d"
|
checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
@ -2081,11 +2080,12 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "time"
|
name = "time"
|
||||||
version = "0.1.43"
|
version = "0.1.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
|
checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
|
"wasi",
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -2163,9 +2163,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-segmentation"
|
name = "unicode-segmentation"
|
||||||
version = "1.7.1"
|
version = "1.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796"
|
checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-width"
|
name = "unicode-width"
|
||||||
|
|
@ -2272,9 +2272,9 @@ checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasi"
|
name = "wasi"
|
||||||
version = "0.10.2+wasi-snapshot-preview1"
|
version = "0.10.0+wasi-snapshot-preview1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
|
checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen"
|
name = "wasm-bindgen"
|
||||||
|
|
@ -2639,6 +2639,7 @@ name = "zellij-client"
|
||||||
version = "0.15.0"
|
version = "0.15.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"insta",
|
"insta",
|
||||||
|
"log",
|
||||||
"mio",
|
"mio",
|
||||||
"termbg",
|
"termbg",
|
||||||
"zellij-utils",
|
"zellij-utils",
|
||||||
|
|
@ -2652,6 +2653,7 @@ dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"base64",
|
"base64",
|
||||||
"cassowary",
|
"cassowary",
|
||||||
|
"chrono",
|
||||||
"daemonize",
|
"daemonize",
|
||||||
"insta",
|
"insta",
|
||||||
"log",
|
"log",
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,6 @@ fn color_elements(palette: Palette) -> ColoredElements {
|
||||||
|
|
||||||
impl ZellijPlugin for State {
|
impl ZellijPlugin for State {
|
||||||
fn load(&mut self) {
|
fn load(&mut self) {
|
||||||
dbg!("hello from load");
|
|
||||||
set_selectable(false);
|
set_selectable(false);
|
||||||
set_invisible_borders(true);
|
set_invisible_borders(true);
|
||||||
set_fixed_height(2);
|
set_fixed_height(2);
|
||||||
|
|
|
||||||
|
|
@ -9,15 +9,11 @@ register_plugin!(State);
|
||||||
|
|
||||||
impl ZellijPlugin for State {
|
impl ZellijPlugin for State {
|
||||||
fn load(&mut self) {
|
fn load(&mut self) {
|
||||||
dbg!("hello from load");
|
|
||||||
dbg!("hello from load2?");
|
|
||||||
refresh_directory(self);
|
refresh_directory(self);
|
||||||
subscribe(&[EventType::KeyPress]);
|
subscribe(&[EventType::KeyPress]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(&mut self, event: Event) {
|
fn update(&mut self, event: Event) {
|
||||||
dbg!("hello from update");
|
|
||||||
|
|
||||||
if let Event::KeyPress(key) = event {
|
if let Event::KeyPress(key) = event {
|
||||||
match key {
|
match key {
|
||||||
Key::Up | Key::Char('k') => {
|
Key::Up | Key::Char('k') => {
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ use zellij_utils::{
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
configure_logger();
|
configure_logger();
|
||||||
info!("Hello Zellij!");
|
info!("Starting Zellij!");
|
||||||
let opts = CliArgs::from_args();
|
let opts = CliArgs::from_args();
|
||||||
|
|
||||||
if let Some(Command::Sessions(Sessions::ListSessions)) = opts.command {
|
if let Some(Command::Sessions(Sessions::ListSessions)) = opts.command {
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ license = "MIT"
|
||||||
mio = "0.7.11"
|
mio = "0.7.11"
|
||||||
termbg = "0.2.3"
|
termbg = "0.2.3"
|
||||||
zellij-utils = { path = "../zellij-utils/", version = "0.15.0" }
|
zellij-utils = { path = "../zellij-utils/", version = "0.15.0" }
|
||||||
|
log = "0.4.14"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
insta = "1.6.0"
|
insta = "1.6.0"
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ pub mod os_input_output;
|
||||||
mod command_is_executing;
|
mod command_is_executing;
|
||||||
mod input_handler;
|
mod input_handler;
|
||||||
|
|
||||||
|
use log::info;
|
||||||
use std::env::current_exe;
|
use std::env::current_exe;
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
@ -291,6 +292,7 @@ pub fn start_client(
|
||||||
);
|
);
|
||||||
|
|
||||||
os_input.disable_mouse();
|
os_input.disable_mouse();
|
||||||
|
info!("{}", exit_msg);
|
||||||
os_input.unset_raw_mode(0);
|
os_input.unset_raw_mode(0);
|
||||||
let mut stdout = os_input.get_stdout_writer();
|
let mut stdout = os_input.get_stdout_writer();
|
||||||
let _ = stdout.write(goodbye_message.as_bytes()).unwrap();
|
let _ = stdout.write(goodbye_message.as_bytes()).unwrap();
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ cassowary = "0.3.0"
|
||||||
zellij-utils = { path = "../zellij-utils/", version = "0.15.0" }
|
zellij-utils = { path = "../zellij-utils/", version = "0.15.0" }
|
||||||
log = "0.4.14"
|
log = "0.4.14"
|
||||||
typetag = "0.1.7"
|
typetag = "0.1.7"
|
||||||
|
chrono = "0.4.19"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
insta = "1.6.0"
|
insta = "1.6.0"
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ pub mod os_input_output;
|
||||||
pub mod panes;
|
pub mod panes;
|
||||||
pub mod tab;
|
pub mod tab;
|
||||||
|
|
||||||
mod decorating_pipe;
|
mod logging_pipe;
|
||||||
mod pty;
|
mod pty;
|
||||||
mod route;
|
mod route;
|
||||||
mod screen;
|
mod screen;
|
||||||
|
|
|
||||||
|
|
@ -3,32 +3,51 @@ use std::{
|
||||||
io::{Read, Seek, Write},
|
io::{Read, Seek, Write},
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::{error, info};
|
use log::{debug, error, info};
|
||||||
use wasmer_wasi::{WasiFile, WasiFsError};
|
use wasmer_wasi::{WasiFile, WasiFsError};
|
||||||
use zellij_utils::serde;
|
use zellij_utils::serde;
|
||||||
|
|
||||||
|
use chrono::prelude::*;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
// 16kB log buffer
|
// 16kB log buffer
|
||||||
const ZELLIJ_MAX_PIPE_BUFFER_SIZE: usize = 16_384;
|
const ZELLIJ_MAX_PIPE_BUFFER_SIZE: usize = 16_384;
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
#[serde(crate = "self::serde")]
|
#[serde(crate = "self::serde")]
|
||||||
pub struct DecoratingPipe {
|
pub struct LoggingPipe {
|
||||||
buffer: VecDeque<u8>,
|
buffer: VecDeque<u8>,
|
||||||
plugin_name: String,
|
plugin_name: String,
|
||||||
|
plugin_id: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DecoratingPipe {
|
impl LoggingPipe {
|
||||||
pub fn new(plugin_name: &str) -> DecoratingPipe {
|
pub fn new(plugin_name: &str, plugin_id: u32) -> LoggingPipe {
|
||||||
info!("Creating decorating pipe for plugin: {}!", plugin_name);
|
info!(
|
||||||
DecoratingPipe {
|
"|{:<25.25}| {} [{:<10.15}] Creating decorating pipe for plugin: {}!",
|
||||||
|
plugin_name,
|
||||||
|
Local::now().format("%Y-%m-%d %H:%M:%S.%3f"),
|
||||||
|
format!("id: {}", plugin_id),
|
||||||
|
plugin_name
|
||||||
|
);
|
||||||
|
LoggingPipe {
|
||||||
buffer: VecDeque::new(),
|
buffer: VecDeque::new(),
|
||||||
plugin_name: String::from(plugin_name),
|
plugin_name: String::from(plugin_name),
|
||||||
|
plugin_id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn log_message(&self, message: &str) {
|
||||||
|
debug!(
|
||||||
|
"|{:<25.25}| {} [{:<10.15}] {}",
|
||||||
|
self.plugin_name,
|
||||||
|
Local::now().format("%Y-%m-%d %H:%M:%S.%3f"),
|
||||||
|
format!("id: {}", self.plugin_id),
|
||||||
|
message
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Read for DecoratingPipe {
|
impl Read for LoggingPipe {
|
||||||
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
|
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
|
||||||
let amt = std::cmp::min(buf.len(), self.buffer.len());
|
let amt = std::cmp::min(buf.len(), self.buffer.len());
|
||||||
for (i, byte) in self.buffer.drain(..amt).enumerate() {
|
for (i, byte) in self.buffer.drain(..amt).enumerate() {
|
||||||
|
|
@ -38,11 +57,9 @@ impl Read for DecoratingPipe {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Write for DecoratingPipe {
|
impl Write for LoggingPipe {
|
||||||
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
|
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
|
||||||
self.buffer.extend(buf);
|
if self.buffer.len() + buf.len() > ZELLIJ_MAX_PIPE_BUFFER_SIZE {
|
||||||
|
|
||||||
if self.buffer.len() > ZELLIJ_MAX_PIPE_BUFFER_SIZE {
|
|
||||||
let error_msg =
|
let error_msg =
|
||||||
"Exceeded log buffer size. Make sure that your plugin calls flush on stderr on \
|
"Exceeded log buffer size. Make sure that your plugin calls flush on stderr on \
|
||||||
valid UTF-8 symbol boundary. Aditionally, make sure that your log message contains \
|
valid UTF-8 symbol boundary. Aditionally, make sure that your log message contains \
|
||||||
|
|
@ -55,6 +72,8 @@ impl Write for DecoratingPipe {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.buffer.extend(buf);
|
||||||
|
|
||||||
Ok(buf.len())
|
Ok(buf.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -73,11 +92,11 @@ impl Write for DecoratingPipe {
|
||||||
if split_converted_buffer.peek().is_none() {
|
if split_converted_buffer.peek().is_none() {
|
||||||
// Log last chunk iff the last char is endline. Otherwise do not do it.
|
// Log last chunk iff the last char is endline. Otherwise do not do it.
|
||||||
if converted_buffer.chars().last().unwrap() == '\n' && !msg.is_empty() {
|
if converted_buffer.chars().last().unwrap() == '\n' && !msg.is_empty() {
|
||||||
info!("|{:<25}| {}", self.plugin_name, msg);
|
self.log_message(msg);
|
||||||
consumed_bytes += msg.len() + 1;
|
consumed_bytes += msg.len() + 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
info!("|{:<25}| {}", self.plugin_name, msg);
|
self.log_message(msg);
|
||||||
consumed_bytes += msg.len() + 1;
|
consumed_bytes += msg.len() + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -91,7 +110,7 @@ impl Write for DecoratingPipe {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Seek for DecoratingPipe {
|
impl Seek for LoggingPipe {
|
||||||
fn seek(&mut self, _pos: std::io::SeekFrom) -> std::io::Result<u64> {
|
fn seek(&mut self, _pos: std::io::SeekFrom) -> std::io::Result<u64> {
|
||||||
Err(std::io::Error::new(
|
Err(std::io::Error::new(
|
||||||
std::io::ErrorKind::Other,
|
std::io::ErrorKind::Other,
|
||||||
|
|
@ -101,7 +120,7 @@ impl Seek for DecoratingPipe {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[typetag::serde]
|
#[typetag::serde]
|
||||||
impl WasiFile for DecoratingPipe {
|
impl WasiFile for LoggingPipe {
|
||||||
fn last_accessed(&self) -> u64 {
|
fn last_accessed(&self) -> u64 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
@ -128,13 +147,13 @@ impl WasiFile for DecoratingPipe {
|
||||||
|
|
||||||
// Unit tests
|
// Unit tests
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod decorating_pipe_test {
|
mod logging_pipe_test {
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn write_without_endl_does_not_consume_buffer_after_flush() {
|
fn write_without_endl_does_not_consume_buffer_after_flush() {
|
||||||
let mut pipe = DecoratingPipe::new("TestPipe");
|
let mut pipe = LoggingPipe::new("TestPipe", 0);
|
||||||
|
|
||||||
let test_buffer = "Testing write".as_bytes();
|
let test_buffer = "Testing write".as_bytes();
|
||||||
|
|
||||||
|
|
@ -146,7 +165,7 @@ mod decorating_pipe_test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn write_with_single_endl_at_the_end_consumes_whole_buffer_after_flush() {
|
fn write_with_single_endl_at_the_end_consumes_whole_buffer_after_flush() {
|
||||||
let mut pipe = DecoratingPipe::new("TestPipe");
|
let mut pipe = LoggingPipe::new("TestPipe", 0);
|
||||||
|
|
||||||
let test_buffer = "Testing write \n".as_bytes();
|
let test_buffer = "Testing write \n".as_bytes();
|
||||||
|
|
||||||
|
|
@ -158,7 +177,7 @@ mod decorating_pipe_test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn write_with_endl_in_the_middle_consumes_buffer_up_to_endl_after_flush() {
|
fn write_with_endl_in_the_middle_consumes_buffer_up_to_endl_after_flush() {
|
||||||
let mut pipe = DecoratingPipe::new("TestPipe");
|
let mut pipe = LoggingPipe::new("TestPipe", 0);
|
||||||
|
|
||||||
let test_buffer = "Testing write \n".as_bytes();
|
let test_buffer = "Testing write \n".as_bytes();
|
||||||
let test_buffer2 = "And the rest".as_bytes();
|
let test_buffer2 = "And the rest".as_bytes();
|
||||||
|
|
@ -182,7 +201,7 @@ mod decorating_pipe_test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn write_with_many_endl_consumes_whole_buffer_after_flush() {
|
fn write_with_many_endl_consumes_whole_buffer_after_flush() {
|
||||||
let mut pipe = DecoratingPipe::new("TestPipe");
|
let mut pipe = LoggingPipe::new("TestPipe", 0);
|
||||||
|
|
||||||
let test_buffer = "Testing write \n".as_bytes();
|
let test_buffer = "Testing write \n".as_bytes();
|
||||||
|
|
||||||
|
|
@ -205,7 +224,7 @@ mod decorating_pipe_test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn write_with_incorrect_byte_boundary_does_not_crash() {
|
fn write_with_incorrect_byte_boundary_does_not_crash() {
|
||||||
let mut pipe = DecoratingPipe::new("TestPipe");
|
let mut pipe = LoggingPipe::new("TestPipe", 0);
|
||||||
|
|
||||||
let test_buffer = "😱".as_bytes();
|
let test_buffer = "😱".as_bytes();
|
||||||
|
|
||||||
|
|
@ -17,7 +17,7 @@ use wasmer_wasi::{Pipe, WasiEnv, WasiState};
|
||||||
use zellij_tile::data::{Event, EventType, PluginIds};
|
use zellij_tile::data::{Event, EventType, PluginIds};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
decorating_pipe::DecoratingPipe,
|
logging_pipe::LoggingPipe,
|
||||||
panes::PaneId,
|
panes::PaneId,
|
||||||
pty::PtyInstruction,
|
pty::PtyInstruction,
|
||||||
screen::ScreenInstruction,
|
screen::ScreenInstruction,
|
||||||
|
|
@ -57,7 +57,7 @@ pub(crate) struct PluginEnv {
|
||||||
|
|
||||||
// Thread main --------------------------------------------------------------------------------------------------------
|
// Thread main --------------------------------------------------------------------------------------------------------
|
||||||
pub(crate) fn wasm_thread_main(bus: Bus<PluginInstruction>, store: Store, data_dir: PathBuf) {
|
pub(crate) fn wasm_thread_main(bus: Bus<PluginInstruction>, store: Store, data_dir: PathBuf) {
|
||||||
info!("Wasm create thread :))");
|
info!("Wasm main thread starts");
|
||||||
let mut plugin_id = 0;
|
let mut plugin_id = 0;
|
||||||
let mut plugin_map = HashMap::new();
|
let mut plugin_map = HashMap::new();
|
||||||
loop {
|
loop {
|
||||||
|
|
@ -76,8 +76,10 @@ pub(crate) fn wasm_thread_main(bus: Bus<PluginInstruction>, store: Store, data_d
|
||||||
|
|
||||||
let output = Pipe::new();
|
let output = Pipe::new();
|
||||||
let input = Pipe::new();
|
let input = Pipe::new();
|
||||||
let stderr =
|
let stderr = LoggingPipe::new(
|
||||||
DecoratingPipe::new(path.as_path().file_name().unwrap().to_str().unwrap());
|
path.as_path().file_name().unwrap().to_str().unwrap(),
|
||||||
|
plugin_id,
|
||||||
|
);
|
||||||
let mut wasi_env = WasiState::new("Zellij")
|
let mut wasi_env = WasiState::new("Zellij")
|
||||||
.env("CLICOLOR_FORCE", "1")
|
.env("CLICOLOR_FORCE", "1")
|
||||||
.preopen(|p| {
|
.preopen(|p| {
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ macro_rules! register_plugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
dbg!("hello from plugin main :)");
|
|
||||||
STATE.with(|state| {
|
STATE.with(|state| {
|
||||||
state.borrow_mut().load();
|
state.borrow_mut().load();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
# Scan this file for changes every 30 seconds
|
|
||||||
refresh_rate: 30 seconds
|
|
||||||
|
|
||||||
appenders:
|
|
||||||
# An appender named "stderr" that writes to stderr
|
|
||||||
stderr:
|
|
||||||
kind: console
|
|
||||||
target: stderr
|
|
||||||
|
|
||||||
# default zellij appender, should be used across most of the codebase.
|
|
||||||
logFile:
|
|
||||||
kind: file
|
|
||||||
path: "zellij.log"
|
|
||||||
append: false
|
|
||||||
encoder:
|
|
||||||
# {n} means platform dependent newline
|
|
||||||
# module is padded to *at least* 25 bytes and thread is padded to be between 10 and 15 bytes.
|
|
||||||
pattern: "|{module:<25}| {date} {highlight({level})} [{thread:<10.15}] [{file}:{line}]: {message} {n}"
|
|
||||||
|
|
||||||
# plugin appender. To be used in decorating_pipe to forward stderr output from plugins.
|
|
||||||
logPlugin:
|
|
||||||
kind: file
|
|
||||||
path: "zellij.log"
|
|
||||||
encoder:
|
|
||||||
# {n} means platform dependent newline
|
|
||||||
pattern: "{message} {n}"
|
|
||||||
|
|
||||||
# Set the default logging level to "info" and log it to zellij.log file
|
|
||||||
root:
|
|
||||||
level: info
|
|
||||||
appenders:
|
|
||||||
- logFile
|
|
||||||
|
|
||||||
loggers:
|
|
||||||
# decrease verbosity for this module because it has a lot of useless info logs
|
|
||||||
wasmer_compiler_cranelift:
|
|
||||||
level: warn
|
|
||||||
appenders:
|
|
||||||
- logFile
|
|
||||||
|
|
||||||
# For decorating_pipe, we use custom format as we use logging macros to forward stderr output from plugins
|
|
||||||
zellij_server::decorating_pipe:
|
|
||||||
level: trace
|
|
||||||
appenders:
|
|
||||||
- logPlugin
|
|
||||||
additive: false
|
|
||||||
|
|
@ -7,13 +7,59 @@ use std::{
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::info;
|
use log::{info, LevelFilter};
|
||||||
|
|
||||||
|
use log4rs::append::file::FileAppender;
|
||||||
|
use log4rs::config::{Appender, Config, Logger, Root};
|
||||||
|
use log4rs::encode::pattern::PatternEncoder;
|
||||||
|
|
||||||
use crate::consts::{ZELLIJ_TMP_LOG_DIR, ZELLIJ_TMP_LOG_FILE};
|
use crate::consts::{ZELLIJ_TMP_LOG_DIR, ZELLIJ_TMP_LOG_FILE};
|
||||||
use crate::shared::set_permissions;
|
use crate::shared::set_permissions;
|
||||||
|
|
||||||
pub fn configure_logger() {
|
pub fn configure_logger() {
|
||||||
log4rs::init_file("zellij-utils/assets/config/log4rs.yml", Default::default()).unwrap();
|
// {n} means platform dependent newline
|
||||||
|
// module is padded to exactly 25 bytes and thread is padded to be between 10 and 15 bytes.
|
||||||
|
let file_pattern = "{highlight({level:<6})} |{module:<25.25}| {date(%Y-%m-%d %H:%M:%S.%3f)} [{thread:<10.15}] [{file}:{line}]: {message} {n}";
|
||||||
|
|
||||||
|
// default zellij appender, should be used across most of the codebase.
|
||||||
|
let log_file = FileAppender::builder()
|
||||||
|
.encoder(Box::new(PatternEncoder::new(file_pattern)))
|
||||||
|
.append(true)
|
||||||
|
.build(ZELLIJ_TMP_LOG_DIR.join("zellij.log"))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// plugin appender. To be used in loggin_pipe to forward stderr output from plugins. We do some formatting
|
||||||
|
// in logging_pipe to print plugin name as 'module' and plugin_id instead of thread.
|
||||||
|
let log_plugin = FileAppender::builder()
|
||||||
|
.encoder(Box::new(PatternEncoder::new(
|
||||||
|
"{highlight({level:<6})} {message} {n}",
|
||||||
|
)))
|
||||||
|
.append(true)
|
||||||
|
.build(ZELLIJ_TMP_LOG_DIR.join("zellij.log"))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Set the default logging level to "info" and log it to zellij.log file
|
||||||
|
// Decrease verbosity for `wasmer_compiler_cranelift` module because it has a lot of useless info logs
|
||||||
|
// For `zellij_server::logging_pipe`, we use custom format as we use logging macros to forward stderr output from plugins
|
||||||
|
let config = Config::builder()
|
||||||
|
.appender(Appender::builder().build("logFile", Box::new(log_file)))
|
||||||
|
.appender(Appender::builder().build("logPlugin", Box::new(log_plugin)))
|
||||||
|
.logger(
|
||||||
|
Logger::builder()
|
||||||
|
.appender("logFile")
|
||||||
|
.build("wasmer_compiler_cranelift", LevelFilter::Warn),
|
||||||
|
)
|
||||||
|
.logger(
|
||||||
|
Logger::builder()
|
||||||
|
.appender("logPlugin")
|
||||||
|
.additive(false)
|
||||||
|
.build("zellij_server::logging_pipe", LevelFilter::Trace),
|
||||||
|
)
|
||||||
|
.build(Root::builder().appender("logFile").build(LevelFilter::Info))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let _ = log4rs::init_config(config).unwrap();
|
||||||
|
|
||||||
info!("Zellij logger initialized");
|
info!("Zellij logger initialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue