diff --git a/Cargo.lock b/Cargo.lock
index 5c4e104..87aac22 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,6 +2,7 @@
 name = "sparkle_os"
 version = "0.1.0"
 dependencies = [
+ "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "rlibc 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "spin 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "volatile 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -33,6 +34,10 @@ version = "0.2.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
+name = "log"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 name = "num"
 version = "0.1.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -208,6 +213,7 @@ dependencies = [
 "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855"
 "checksum csv 0.14.7 (registry+https://github.com/rust-lang/crates.io-index)" = "266c1815d7ca63a5bd86284043faf91e8c95e943e55ce05dc0ae08e952de18bc"
 "checksum libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)" = "e7eb6b826bfc1fdea7935d46556250d1799b7fe2d9f7951071f4291710665e3e"
+"checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"
 "checksum num 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "98b15ba84e910ea7a1973bccd3df7b31ae282bf9d8bd2897779950c9b8303d40"
 "checksum num-bigint 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "ba6d838b16e56da1b6c383d065ff1ec3c7d7797f65a3e8f6ba7092fd87820bac"
 "checksum num-complex 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "148eb324ca772230853418731ffdf13531738b50f89b30692a01fcdcb0a64677"
diff --git a/Cargo.toml b/Cargo.toml
index 8c851f6..c2de024 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,3 +11,6 @@ rlibc = "1.0"
 spin = "0.4.5"
 volatile = "0.2"
 x86 = "0.8"
+[dependencies.log]
+version = "0.3"
+default-features = false
diff --git a/src/lib.rs b/src/lib.rs
index 741fb7b..72e877d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -4,6 +4,8 @@
 #![feature(lang_items)]
 #![no_std]
 
+#[macro_use]
+extern crate log;
 extern crate rlibc;
 extern crate spin;
 extern crate volatile;
@@ -12,6 +14,7 @@ mod arch;
 #[macro_use]
 mod macros;
 mod misc;
+mod logger;
 
 use arch::x86_64::device::vga_console;
 
@@ -25,6 +28,7 @@ pub extern fn kernel_main() {
     vga_console::WRITER.lock().clear_screen();
     println!("--- Sparkle v{} booting! ---", ::misc::VERSION);
 
+    logger::init().expect("Logger failed to launch!");
 
 
     loop {}
diff --git a/src/logger.rs b/src/logger.rs
new file mode 100644
index 0000000..36aab98
--- /dev/null
+++ b/src/logger.rs
@@ -0,0 +1,28 @@
+//! A basic console logging backend for the `log` crate.
+
+use log;
+use log::{Log, LogRecord, LogLevel, LogLevelFilter, LogMetadata};
+use log::{SetLoggerError};
+
+pub fn init() -> Result<(), SetLoggerError> {
+    unsafe {
+        log::set_logger_raw(|max_log_level| {
+            static LOGGER: ConsoleLogger = ConsoleLogger;
+            max_log_level.set(LogLevelFilter::Info);
+            &ConsoleLogger
+        })
+    }
+}
+
+struct ConsoleLogger;
+impl Log for ConsoleLogger {
+    fn enabled(&self, metadata: &LogMetadata) -> bool {
+        metadata.level() <= LogLevel::Info
+    }
+
+    fn log(&self, record: &LogRecord) {
+        if self.enabled(record.metadata()) {
+            println!("{} - {}", record.level(), record.args());
+        }
+    }
+}