diff --git a/lib/fluent/supervisor.rb b/lib/fluent/supervisor.rb
index 1b456e5b7f..3f0c74dd6e 100644
--- a/lib/fluent/supervisor.rb
+++ b/lib/fluent/supervisor.rb
@@ -362,6 +362,7 @@ def reopen!
 
       def apply_options(opts)
         $log.format = opts[:format] if opts[:format]
+        $log.time_format = opts[:time_format] if opts[:time_format]
       end
 
       def level=(level)
@@ -443,7 +444,7 @@ def run_supervisor
       show_plugin_config if @show_plugin_config
       read_config
       set_system_config
-      @log.apply_options(format: @system_config.log.format)
+      @log.apply_options(format: @system_config.log.format, time_format: @system_config.log.time_format)
 
       $log.info :supervisor, "parsing config file is succeeded", path: @config_path
 
@@ -495,7 +496,7 @@ def run_worker
       show_plugin_config if @show_plugin_config
       read_config
       set_system_config
-      @log.apply_options(format: @system_config.log.format)
+      @log.apply_options(format: @system_config.log.format, time_format: @system_config.log.time_format)
 
       Process.setproctitle("worker:#{@process_name}") if @process_name
 
diff --git a/lib/fluent/system_config.rb b/lib/fluent/system_config.rb
index 9301392e02..0dbd6731e5 100644
--- a/lib/fluent/system_config.rb
+++ b/lib/fluent/system_config.rb
@@ -48,6 +48,7 @@ class SystemConfig
     end
     config_section :log, required: false, init: true, multi: false do
       config_param :format, :enum, list: [:text, :json], default: :text
+      config_param :time_format, :string, default: '%Y-%m-%d %H:%M:%S %z'
     end
 
     def self.create(conf)
diff --git a/test/config/test_system_config.rb b/test/config/test_system_config.rb
index f873915e8c..fc681f9f3b 100644
--- a/test/config/test_system_config.rb
+++ b/test/config/test_system_config.rb
@@ -56,6 +56,7 @@ def parse_text(text)
       assert_nil(sc.suppress_config_dump)
       assert_nil(sc.without_source)
       assert_equal(:text, sc.log.format)
+      assert_equal('%Y-%m-%d %H:%M:%S %z', sc.log.time_format)
       assert_equal(1, s.instance_variable_get(:@workers))
       assert_nil(s.instance_variable_get(:@root_dir))
       assert_equal(Fluent::Log::LEVEL_INFO, s.instance_variable_get(:@log_level))
@@ -97,6 +98,7 @@ def parse_text(text)
           <system>
             <log>
               format json
+              time_format %Y
             </log>
           </system>
       EOS
@@ -104,6 +106,7 @@ def parse_text(text)
       sc = Fluent::SystemConfig.new(conf)
       sc.apply(s)
       assert_equal(:json, sc.log.format)
+      assert_equal('%Y', sc.log.time_format)
     end
 
     data(
diff --git a/test/test_log.rb b/test/test_log.rb
index a767f69790..685524a361 100644
--- a/test/test_log.rb
+++ b/test/test_log.rb
@@ -405,6 +405,30 @@ def test_format_json
                  })
   end
 
+  def test_time_format
+    logdev = @log_device
+    logger = ServerEngine::DaemonLogger.new(logdev)
+    log = Fluent::Log.new(logger)
+    log.time_format = "%Y"
+    log.level = Fluent::Log::LEVEL_TRACE
+    log.trace "trace log"
+    log.debug "debug log"
+    log.info "info log"
+    log.warn "warn log"
+    log.error "error log"
+    log.fatal "fatal log"
+    timestamp_str = @timestamp.strftime("%Y")
+    expected = [
+      "#{timestamp_str} [trace]: trace log\n",
+      "#{timestamp_str} [debug]: debug log\n",
+      "#{timestamp_str} [info]: info log\n",
+      "#{timestamp_str} [warn]: warn log\n",
+      "#{timestamp_str} [error]: error log\n",
+      "#{timestamp_str} [fatal]: fatal log\n"
+    ]
+    assert_equal(expected, log.out.logs)
+  end
+
   def test_disable_events
     dl_opts = {}
     dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
diff --git a/test/test_supervisor.rb b/test/test_supervisor.rb
index 592dec1853..1bc3649455 100644
--- a/test/test_supervisor.rb
+++ b/test/test_supervisor.rb
@@ -132,6 +132,7 @@ def test_system_config
   root_dir #{TMP_ROOT_DIR}
   <log>
     format json
+    time_format %Y
   </log>
 </system>
     EOC
@@ -149,6 +150,7 @@ def test_system_config
     assert_equal 2, sys_conf.log_level
     assert_equal TMP_ROOT_DIR, sys_conf.root_dir
     assert_equal :json, sys_conf.log.format
+    assert_equal '%Y', sys_conf.log.time_format
   end
 
   def test_main_process_signal_handlers