diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index d34538f27564b5af22131ec28a6a14c8f0209c7e..eed4ecc11220a43bad5bea5996c59b0a860e95ee 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -90,6 +90,7 @@ set (COMMON_LIB_SRC_FILES
   log/DummyLogger.cpp
   log/LogContext.cpp
   log/Logger.cpp
+  log/LogLevel.cpp
   log/Message.cpp
   log/Param.cpp
   log/StringLogger.cpp
@@ -143,6 +144,7 @@ set (COMMON_UNIT_TESTS_LIB_SRC_FILES
   dataStructures/StorageClassTest.cpp
   processCap/SmartCapTest.cpp
   log/LogContextTest.cpp
+  log/LogLevelTest.cpp
   log/ParamTest.cpp
   log/SyslogLoggerTest.cpp
   log/StringLoggerTest.cpp
diff --git a/common/log/LogLevel.cpp b/common/log/LogLevel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9f9f847480f60adb2ebd1aa86cfe9a44a6b3db16
--- /dev/null
+++ b/common/log/LogLevel.cpp
@@ -0,0 +1,46 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "common/exception/Exception.hpp"
+#include "common/log/Constants.hpp"
+
+namespace cta {
+namespace log {
+
+//------------------------------------------------------------------------------
+// toLogLevel
+//------------------------------------------------------------------------------
+int toLogLevel(const std::string &s) {
+  if(s == "EMERG")   return EMERG;
+  if(s == "ALERT")   return ALERT;
+  if(s == "CRIT")    return CRIT;
+  if(s == "ERR")     return ERR;
+  if(s == "WARNING") return WARNING;
+  if(s == "NOTICE")  return NOTICE;
+  if(s == "INFO")    return INFO;
+  if(s == "DEBUG")   return DEBUG;
+
+  // It is a convention of CTA to use syslog level of LOG_NOTICE to label
+  // user errors.
+  if(s == "USERERR") return NOTICE;
+
+  throw exception::Exception(s + " is not a valid log level");
+}
+
+} // namespace log
+} // namespace cta
diff --git a/common/log/LogLevel.hpp b/common/log/LogLevel.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..e57e8e4832381ad3ab0404c75c167f6f3b25e123
--- /dev/null
+++ b/common/log/LogLevel.hpp
@@ -0,0 +1,34 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "common/log/Constants.hpp"
+
+#include <string>
+
+namespace cta {
+namespace log {
+
+/**
+ * Returns the numeric value of the specified log level.
+ */
+int toLogLevel(const std::string &s);
+
+} // namespace log
+} // namespace cta
diff --git a/common/log/LogLevelTest.cpp b/common/log/LogLevelTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ffc8151427d2114fb9f3c8a8057249d7d4f05297
--- /dev/null
+++ b/common/log/LogLevelTest.cpp
@@ -0,0 +1,91 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "common/log/LogLevel.hpp"
+
+#include <gtest/gtest.h>
+
+namespace unitTests {
+
+class cta_log_LogLevelTest : public ::testing::Test {
+protected:
+
+  virtual void SetUp() {
+  }
+
+  virtual void TearDown() {
+  }
+}; // class cta_log_LogLevelTest
+
+TEST_F(cta_log_LogLevelTest, toLogLevel_EMERG) {
+  using namespace cta::log;
+
+  ASSERT_EQ(EMERG, toLogLevel("EMERG"));
+}
+
+TEST_F(cta_log_LogLevelTest, toLogLevel_ALERT) {
+  using namespace cta::log;
+
+  ASSERT_EQ(ALERT, toLogLevel("ALERT"));
+}
+
+TEST_F(cta_log_LogLevelTest, toLogLevel_CRIT) {
+  using namespace cta::log;
+
+  ASSERT_EQ(CRIT, toLogLevel("CRIT"));
+}
+
+TEST_F(cta_log_LogLevelTest, toLogLevel_ERR) {
+  using namespace cta::log;
+
+  ASSERT_EQ(ERR, toLogLevel("ERR"));
+}
+
+TEST_F(cta_log_LogLevelTest, toLogLevel_WARNING) {
+  using namespace cta::log;
+
+  ASSERT_EQ(WARNING, toLogLevel("WARNING"));
+}
+
+TEST_F(cta_log_LogLevelTest, toLogLevel_NOTICE) {
+  using namespace cta::log;
+
+  ASSERT_EQ(NOTICE, toLogLevel("NOTICE"));
+}
+
+TEST_F(cta_log_LogLevelTest, toLogLevel_INFO) {
+  using namespace cta::log;
+
+  ASSERT_EQ(INFO, toLogLevel("INFO"));
+}
+
+TEST_F(cta_log_LogLevelTest, toLogLevel_DEBUG) {
+  using namespace cta::log;
+
+  ASSERT_EQ(DEBUG, toLogLevel("DEBUG"));
+}
+
+TEST_F(cta_log_LogLevelTest, toLogLevel_USERERR) {
+  using namespace cta::log;
+
+  // It is a convention of CTA to use syslog level of LOG_NOTICE to label
+  // user errors.
+  ASSERT_EQ(NOTICE, toLogLevel("USERERR"));
+}
+
+} // namespace unitTests