fluentd 1.16.5 → 1.17.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (268) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +88 -0
  3. data/README.md +2 -1
  4. data/Rakefile +1 -1
  5. data/SECURITY.md +2 -2
  6. data/fluent.conf +14 -14
  7. data/lib/fluent/command/binlog_reader.rb +1 -1
  8. data/lib/fluent/command/cap_ctl.rb +4 -4
  9. data/lib/fluent/compat/call_super_mixin.rb +3 -3
  10. data/lib/fluent/compat/propagate_default.rb +4 -4
  11. data/lib/fluent/config/configure_proxy.rb +2 -2
  12. data/lib/fluent/config/types.rb +1 -1
  13. data/lib/fluent/config/yaml_parser/parser.rb +4 -0
  14. data/lib/fluent/configurable.rb +2 -2
  15. data/lib/fluent/counter/mutex_hash.rb +1 -1
  16. data/lib/fluent/fluent_log_event_router.rb +0 -2
  17. data/lib/fluent/log/console_adapter.rb +4 -2
  18. data/lib/fluent/plugin/buf_file.rb +1 -1
  19. data/lib/fluent/plugin/buffer/file_chunk.rb +1 -1
  20. data/lib/fluent/plugin/buffer/file_single_chunk.rb +2 -3
  21. data/lib/fluent/plugin/filter_parser.rb +26 -8
  22. data/lib/fluent/plugin/in_exec.rb +14 -2
  23. data/lib/fluent/plugin/in_http.rb +19 -54
  24. data/lib/fluent/plugin/in_sample.rb +13 -7
  25. data/lib/fluent/plugin/in_tail.rb +99 -25
  26. data/lib/fluent/plugin/out_copy.rb +1 -1
  27. data/lib/fluent/plugin/out_file.rb +8 -0
  28. data/lib/fluent/plugin/out_http.rb +137 -13
  29. data/lib/fluent/plugin/owned_by_mixin.rb +0 -1
  30. data/lib/fluent/plugin/parser_json.rb +26 -17
  31. data/lib/fluent/plugin/parser_msgpack.rb +24 -3
  32. data/lib/fluent/plugin_helper/http_server/server.rb +1 -1
  33. data/lib/fluent/plugin_helper/metrics.rb +2 -2
  34. data/lib/fluent/registry.rb +6 -6
  35. data/lib/fluent/test/output_test.rb +1 -1
  36. data/lib/fluent/unique_id.rb +1 -1
  37. data/lib/fluent/version.rb +1 -1
  38. data/templates/new_gem/fluent-plugin.gemspec.erb +6 -5
  39. metadata +109 -459
  40. data/.github/ISSUE_TEMPLATE/bug_report.yml +0 -71
  41. data/.github/ISSUE_TEMPLATE/config.yml +0 -5
  42. data/.github/ISSUE_TEMPLATE/feature_request.yml +0 -39
  43. data/.github/ISSUE_TEMPLATE.md +0 -17
  44. data/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  45. data/.github/workflows/stale-actions.yml +0 -24
  46. data/.github/workflows/test.yml +0 -32
  47. data/.gitignore +0 -30
  48. data/Gemfile +0 -9
  49. data/fluentd.gemspec +0 -54
  50. data/test/command/test_binlog_reader.rb +0 -362
  51. data/test/command/test_ca_generate.rb +0 -70
  52. data/test/command/test_cap_ctl.rb +0 -100
  53. data/test/command/test_cat.rb +0 -128
  54. data/test/command/test_ctl.rb +0 -56
  55. data/test/command/test_fluentd.rb +0 -1291
  56. data/test/command/test_plugin_config_formatter.rb +0 -397
  57. data/test/command/test_plugin_generator.rb +0 -109
  58. data/test/compat/test_calls_super.rb +0 -166
  59. data/test/compat/test_parser.rb +0 -92
  60. data/test/config/assertions.rb +0 -42
  61. data/test/config/test_config_parser.rb +0 -551
  62. data/test/config/test_configurable.rb +0 -1784
  63. data/test/config/test_configure_proxy.rb +0 -604
  64. data/test/config/test_dsl.rb +0 -415
  65. data/test/config/test_element.rb +0 -518
  66. data/test/config/test_literal_parser.rb +0 -309
  67. data/test/config/test_plugin_configuration.rb +0 -56
  68. data/test/config/test_section.rb +0 -191
  69. data/test/config/test_system_config.rb +0 -195
  70. data/test/config/test_types.rb +0 -408
  71. data/test/counter/test_client.rb +0 -563
  72. data/test/counter/test_error.rb +0 -44
  73. data/test/counter/test_mutex_hash.rb +0 -179
  74. data/test/counter/test_server.rb +0 -589
  75. data/test/counter/test_store.rb +0 -258
  76. data/test/counter/test_validator.rb +0 -137
  77. data/test/helper.rb +0 -155
  78. data/test/helpers/fuzzy_assert.rb +0 -89
  79. data/test/helpers/process_extenstion.rb +0 -33
  80. data/test/log/test_console_adapter.rb +0 -110
  81. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  82. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  83. data/test/plugin/data/2010/01/20100102.log +0 -0
  84. data/test/plugin/data/log/bar +0 -0
  85. data/test/plugin/data/log/foo/bar.log +0 -0
  86. data/test/plugin/data/log/foo/bar2 +0 -0
  87. data/test/plugin/data/log/test.log +0 -0
  88. data/test/plugin/data/sd_file/config +0 -11
  89. data/test/plugin/data/sd_file/config.json +0 -17
  90. data/test/plugin/data/sd_file/config.yaml +0 -11
  91. data/test/plugin/data/sd_file/config.yml +0 -11
  92. data/test/plugin/data/sd_file/invalid_config.yml +0 -7
  93. data/test/plugin/in_tail/test_fifo.rb +0 -121
  94. data/test/plugin/in_tail/test_io_handler.rb +0 -150
  95. data/test/plugin/in_tail/test_position_file.rb +0 -346
  96. data/test/plugin/out_forward/test_ack_handler.rb +0 -140
  97. data/test/plugin/out_forward/test_connection_manager.rb +0 -145
  98. data/test/plugin/out_forward/test_handshake_protocol.rb +0 -112
  99. data/test/plugin/out_forward/test_load_balancer.rb +0 -106
  100. data/test/plugin/out_forward/test_socket_cache.rb +0 -174
  101. data/test/plugin/test_bare_output.rb +0 -131
  102. data/test/plugin/test_base.rb +0 -247
  103. data/test/plugin/test_buf_file.rb +0 -1314
  104. data/test/plugin/test_buf_file_single.rb +0 -898
  105. data/test/plugin/test_buf_memory.rb +0 -42
  106. data/test/plugin/test_buffer.rb +0 -1493
  107. data/test/plugin/test_buffer_chunk.rb +0 -209
  108. data/test/plugin/test_buffer_file_chunk.rb +0 -871
  109. data/test/plugin/test_buffer_file_single_chunk.rb +0 -611
  110. data/test/plugin/test_buffer_memory_chunk.rb +0 -339
  111. data/test/plugin/test_compressable.rb +0 -87
  112. data/test/plugin/test_file_util.rb +0 -96
  113. data/test/plugin/test_filter.rb +0 -368
  114. data/test/plugin/test_filter_grep.rb +0 -697
  115. data/test/plugin/test_filter_parser.rb +0 -731
  116. data/test/plugin/test_filter_record_transformer.rb +0 -577
  117. data/test/plugin/test_filter_stdout.rb +0 -207
  118. data/test/plugin/test_formatter_csv.rb +0 -136
  119. data/test/plugin/test_formatter_hash.rb +0 -38
  120. data/test/plugin/test_formatter_json.rb +0 -61
  121. data/test/plugin/test_formatter_ltsv.rb +0 -70
  122. data/test/plugin/test_formatter_msgpack.rb +0 -28
  123. data/test/plugin/test_formatter_out_file.rb +0 -116
  124. data/test/plugin/test_formatter_single_value.rb +0 -44
  125. data/test/plugin/test_formatter_tsv.rb +0 -76
  126. data/test/plugin/test_in_debug_agent.rb +0 -49
  127. data/test/plugin/test_in_exec.rb +0 -261
  128. data/test/plugin/test_in_forward.rb +0 -1178
  129. data/test/plugin/test_in_gc_stat.rb +0 -62
  130. data/test/plugin/test_in_http.rb +0 -1102
  131. data/test/plugin/test_in_monitor_agent.rb +0 -922
  132. data/test/plugin/test_in_object_space.rb +0 -66
  133. data/test/plugin/test_in_sample.rb +0 -190
  134. data/test/plugin/test_in_syslog.rb +0 -505
  135. data/test/plugin/test_in_tail.rb +0 -3288
  136. data/test/plugin/test_in_tcp.rb +0 -328
  137. data/test/plugin/test_in_udp.rb +0 -296
  138. data/test/plugin/test_in_unix.rb +0 -181
  139. data/test/plugin/test_input.rb +0 -137
  140. data/test/plugin/test_metadata.rb +0 -89
  141. data/test/plugin/test_metrics.rb +0 -294
  142. data/test/plugin/test_metrics_local.rb +0 -96
  143. data/test/plugin/test_multi_output.rb +0 -204
  144. data/test/plugin/test_out_copy.rb +0 -308
  145. data/test/plugin/test_out_exec.rb +0 -312
  146. data/test/plugin/test_out_exec_filter.rb +0 -606
  147. data/test/plugin/test_out_file.rb +0 -1038
  148. data/test/plugin/test_out_forward.rb +0 -1349
  149. data/test/plugin/test_out_http.rb +0 -429
  150. data/test/plugin/test_out_null.rb +0 -105
  151. data/test/plugin/test_out_relabel.rb +0 -28
  152. data/test/plugin/test_out_roundrobin.rb +0 -146
  153. data/test/plugin/test_out_secondary_file.rb +0 -458
  154. data/test/plugin/test_out_stdout.rb +0 -205
  155. data/test/plugin/test_out_stream.rb +0 -103
  156. data/test/plugin/test_output.rb +0 -1334
  157. data/test/plugin/test_output_as_buffered.rb +0 -2024
  158. data/test/plugin/test_output_as_buffered_backup.rb +0 -363
  159. data/test/plugin/test_output_as_buffered_compress.rb +0 -179
  160. data/test/plugin/test_output_as_buffered_overflow.rb +0 -250
  161. data/test/plugin/test_output_as_buffered_retries.rb +0 -966
  162. data/test/plugin/test_output_as_buffered_secondary.rb +0 -882
  163. data/test/plugin/test_output_as_standard.rb +0 -374
  164. data/test/plugin/test_owned_by.rb +0 -35
  165. data/test/plugin/test_parser.rb +0 -399
  166. data/test/plugin/test_parser_apache.rb +0 -42
  167. data/test/plugin/test_parser_apache2.rb +0 -47
  168. data/test/plugin/test_parser_apache_error.rb +0 -45
  169. data/test/plugin/test_parser_csv.rb +0 -200
  170. data/test/plugin/test_parser_json.rb +0 -138
  171. data/test/plugin/test_parser_labeled_tsv.rb +0 -160
  172. data/test/plugin/test_parser_multiline.rb +0 -111
  173. data/test/plugin/test_parser_nginx.rb +0 -88
  174. data/test/plugin/test_parser_none.rb +0 -52
  175. data/test/plugin/test_parser_regexp.rb +0 -284
  176. data/test/plugin/test_parser_syslog.rb +0 -650
  177. data/test/plugin/test_parser_tsv.rb +0 -122
  178. data/test/plugin/test_sd_file.rb +0 -228
  179. data/test/plugin/test_sd_srv.rb +0 -230
  180. data/test/plugin/test_storage.rb +0 -167
  181. data/test/plugin/test_storage_local.rb +0 -335
  182. data/test/plugin/test_string_util.rb +0 -26
  183. data/test/plugin_helper/data/cert/cert-key.pem +0 -27
  184. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +0 -19
  185. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +0 -19
  186. data/test/plugin_helper/data/cert/cert.pem +0 -19
  187. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +0 -27
  188. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +0 -20
  189. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +0 -27
  190. data/test/plugin_helper/data/cert/cert_chains/cert.pem +0 -40
  191. data/test/plugin_helper/data/cert/empty.pem +0 -0
  192. data/test/plugin_helper/data/cert/generate_cert.rb +0 -125
  193. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +0 -30
  194. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +0 -27
  195. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +0 -20
  196. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +0 -20
  197. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +0 -30
  198. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +0 -27
  199. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +0 -21
  200. data/test/plugin_helper/data/cert/with_ca/cert.pem +0 -21
  201. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +0 -30
  202. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +0 -27
  203. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +0 -20
  204. data/test/plugin_helper/data/cert/without_ca/cert.pem +0 -20
  205. data/test/plugin_helper/http_server/test_app.rb +0 -65
  206. data/test/plugin_helper/http_server/test_route.rb +0 -32
  207. data/test/plugin_helper/service_discovery/test_manager.rb +0 -93
  208. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +0 -21
  209. data/test/plugin_helper/test_cert_option.rb +0 -25
  210. data/test/plugin_helper/test_child_process.rb +0 -862
  211. data/test/plugin_helper/test_compat_parameters.rb +0 -358
  212. data/test/plugin_helper/test_event_emitter.rb +0 -80
  213. data/test/plugin_helper/test_event_loop.rb +0 -52
  214. data/test/plugin_helper/test_extract.rb +0 -194
  215. data/test/plugin_helper/test_formatter.rb +0 -255
  216. data/test/plugin_helper/test_http_server_helper.rb +0 -372
  217. data/test/plugin_helper/test_inject.rb +0 -561
  218. data/test/plugin_helper/test_metrics.rb +0 -137
  219. data/test/plugin_helper/test_parser.rb +0 -264
  220. data/test/plugin_helper/test_record_accessor.rb +0 -238
  221. data/test/plugin_helper/test_retry_state.rb +0 -1006
  222. data/test/plugin_helper/test_server.rb +0 -1895
  223. data/test/plugin_helper/test_service_discovery.rb +0 -165
  224. data/test/plugin_helper/test_socket.rb +0 -146
  225. data/test/plugin_helper/test_storage.rb +0 -542
  226. data/test/plugin_helper/test_thread.rb +0 -164
  227. data/test/plugin_helper/test_timer.rb +0 -130
  228. data/test/scripts/exec_script.rb +0 -32
  229. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +0 -7
  230. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +0 -7
  231. data/test/scripts/fluent/plugin/formatter_known.rb +0 -8
  232. data/test/scripts/fluent/plugin/out_test.rb +0 -81
  233. data/test/scripts/fluent/plugin/out_test2.rb +0 -80
  234. data/test/scripts/fluent/plugin/parser_known.rb +0 -4
  235. data/test/test_capability.rb +0 -74
  236. data/test/test_clock.rb +0 -164
  237. data/test/test_config.rb +0 -369
  238. data/test/test_configdsl.rb +0 -148
  239. data/test/test_daemonizer.rb +0 -91
  240. data/test/test_engine.rb +0 -203
  241. data/test/test_event.rb +0 -531
  242. data/test/test_event_router.rb +0 -348
  243. data/test/test_event_time.rb +0 -199
  244. data/test/test_file_wrapper.rb +0 -53
  245. data/test/test_filter.rb +0 -121
  246. data/test/test_fluent_log_event_router.rb +0 -99
  247. data/test/test_formatter.rb +0 -369
  248. data/test/test_input.rb +0 -31
  249. data/test/test_log.rb +0 -1076
  250. data/test/test_match.rb +0 -148
  251. data/test/test_mixin.rb +0 -351
  252. data/test/test_msgpack_factory.rb +0 -50
  253. data/test/test_oj_options.rb +0 -55
  254. data/test/test_output.rb +0 -278
  255. data/test/test_plugin.rb +0 -251
  256. data/test/test_plugin_classes.rb +0 -370
  257. data/test/test_plugin_helper.rb +0 -81
  258. data/test/test_plugin_id.rb +0 -119
  259. data/test/test_process.rb +0 -14
  260. data/test/test_root_agent.rb +0 -951
  261. data/test/test_static_config_analysis.rb +0 -177
  262. data/test/test_supervisor.rb +0 -821
  263. data/test/test_test_drivers.rb +0 -136
  264. data/test/test_time_formatter.rb +0 -301
  265. data/test/test_time_parser.rb +0 -362
  266. data/test/test_tls.rb +0 -65
  267. data/test/test_unique_id.rb +0 -47
  268. data/test/test_variable_store.rb +0 -65
data/test/test_log.rb DELETED
@@ -1,1076 +0,0 @@
1
- require_relative 'helper'
2
- require 'fluent/test/driver/input'
3
- require 'fluent/engine'
4
- require 'fluent/log'
5
- require 'timecop'
6
- require 'logger'
7
- require 'securerandom'
8
- require 'pathname'
9
-
10
- class LogTest < Test::Unit::TestCase
11
- def tmp_dir
12
- File.join(File.dirname(__FILE__), "tmp", "log", "#{ENV['TEST_ENV_NUMBER']}", SecureRandom.hex(10))
13
- end
14
-
15
- def setup
16
- @tmp_dir = tmp_dir
17
- FileUtils.mkdir_p(@tmp_dir)
18
- @log_device = Fluent::Test::DummyLogDevice.new
19
- @timestamp = Time.parse("2016-04-21 02:58:41 +0000")
20
- @timestamp_str = @timestamp.strftime("%Y-%m-%d %H:%M:%S %z")
21
- Timecop.freeze(@timestamp)
22
- end
23
-
24
- def teardown
25
- @log_device.reset
26
- Timecop.return
27
- Thread.current[:last_repeated_stacktrace] = nil
28
- begin
29
- FileUtils.rm_rf(@tmp_dir)
30
- rescue Errno::EACCES
31
- # It may occur on Windows because of delete pending state due to delayed GC.
32
- # Ruby 3.2 or later doesn't ignore Errno::EACCES:
33
- # https://github.com/ruby/ruby/commit/983115cf3c8f75b1afbe3274f02c1529e1ce3a81
34
- end
35
- end
36
-
37
- def test_per_process_path
38
- path = Fluent::Log.per_process_path("C:/tmp/test.log", :supervisor, 0)
39
- assert_equal(path, "C:/tmp/test-supervisor-0.log")
40
-
41
- path = Fluent::Log.per_process_path("C:/tmp/test.log", :worker, 1)
42
- assert_equal(path, "C:/tmp/test-1.log")
43
- end
44
-
45
- sub_test_case "log level" do
46
- data(
47
- trace: [Fluent::Log::LEVEL_TRACE, 0],
48
- debug: [Fluent::Log::LEVEL_DEBUG, 1],
49
- info: [Fluent::Log::LEVEL_INFO, 2],
50
- warn: [Fluent::Log::LEVEL_WARN, 3],
51
- error: [Fluent::Log::LEVEL_ERROR, 4],
52
- fatal: [Fluent::Log::LEVEL_FATAL, 5],
53
- )
54
- def test_output(data)
55
- log_level, start = data
56
- logdev = @log_device
57
- logger = ServerEngine::DaemonLogger.new(logdev)
58
- log = Fluent::Log.new(logger)
59
- log.level = log_level
60
- log.trace "trace log"
61
- log.debug "debug log"
62
- log.info "info log"
63
- log.warn "warn log"
64
- log.error "error log"
65
- log.fatal "fatal log"
66
- expected = [
67
- "#{@timestamp_str} [trace]: trace log\n",
68
- "#{@timestamp_str} [debug]: debug log\n",
69
- "#{@timestamp_str} [info]: info log\n",
70
- "#{@timestamp_str} [warn]: warn log\n",
71
- "#{@timestamp_str} [error]: error log\n",
72
- "#{@timestamp_str} [fatal]: fatal log\n"
73
- ][start..-1]
74
- assert_equal(expected, log.out.logs)
75
- end
76
-
77
- data(
78
- trace: [ServerEngine::DaemonLogger::TRACE, 0],
79
- debug: [ServerEngine::DaemonLogger::DEBUG, 1],
80
- info: [ServerEngine::DaemonLogger::INFO, 2],
81
- warn: [ServerEngine::DaemonLogger::WARN, 3],
82
- error: [ServerEngine::DaemonLogger::ERROR, 4],
83
- fatal: [ServerEngine::DaemonLogger::FATAL, 5],
84
- )
85
- def test_output_with_serverengine_loglevel(data)
86
- log_level, start = data
87
-
88
- dl_opts = {}
89
- dl_opts[:log_level] = log_level
90
- logdev = @log_device
91
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
92
- log = Fluent::Log.new(logger)
93
- log.trace "trace log"
94
- log.debug "debug log"
95
- log.info "info log"
96
- log.warn "warn log"
97
- log.error "error log"
98
- log.fatal "fatal log"
99
- expected = [
100
- "#{@timestamp_str} [trace]: trace log\n",
101
- "#{@timestamp_str} [debug]: debug log\n",
102
- "#{@timestamp_str} [info]: info log\n",
103
- "#{@timestamp_str} [warn]: warn log\n",
104
- "#{@timestamp_str} [error]: error log\n",
105
- "#{@timestamp_str} [fatal]: fatal log\n"
106
- ][start..-1]
107
- assert_equal(expected, log.out.logs)
108
- end
109
-
110
- data(
111
- trace: [Fluent::Log::LEVEL_TRACE, 0],
112
- debug: [Fluent::Log::LEVEL_DEBUG, 1],
113
- info: [Fluent::Log::LEVEL_INFO, 2],
114
- warn: [Fluent::Log::LEVEL_WARN, 3],
115
- error: [Fluent::Log::LEVEL_ERROR, 4],
116
- fatal: [Fluent::Log::LEVEL_FATAL, 5],
117
- )
118
- def test_output_with_block(data)
119
- log_level, start = data
120
-
121
- logdev = @log_device
122
- logger = ServerEngine::DaemonLogger.new(logdev)
123
- log = Fluent::Log.new(logger)
124
- log.level = log_level
125
- log.trace { "trace log" }
126
- log.debug { "debug log" }
127
- log.info { "info log" }
128
- log.warn { "warn log" }
129
- log.error { "error log" }
130
- log.fatal { "fatal log" }
131
- expected = [
132
- "#{@timestamp_str} [trace]: trace log\n",
133
- "#{@timestamp_str} [debug]: debug log\n",
134
- "#{@timestamp_str} [info]: info log\n",
135
- "#{@timestamp_str} [warn]: warn log\n",
136
- "#{@timestamp_str} [error]: error log\n",
137
- "#{@timestamp_str} [fatal]: fatal log\n"
138
- ][start..-1]
139
- assert_equal(expected, log.out.logs)
140
- end
141
-
142
- data(
143
- trace: [ServerEngine::DaemonLogger::TRACE, 0],
144
- debug: [ServerEngine::DaemonLogger::DEBUG, 1],
145
- info: [ServerEngine::DaemonLogger::INFO, 2],
146
- warn: [ServerEngine::DaemonLogger::WARN, 3],
147
- error: [ServerEngine::DaemonLogger::ERROR, 4],
148
- fatal: [ServerEngine::DaemonLogger::FATAL, 5],
149
- )
150
- def test_output_with_block_with_serverengine_loglevel(data)
151
- log_level, start = data
152
-
153
- dl_opts = {}
154
- dl_opts[:log_level] = log_level
155
- logdev = @log_device
156
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
157
- log = Fluent::Log.new(logger)
158
- log.trace { "trace log" }
159
- log.debug { "debug log" }
160
- log.info { "info log" }
161
- log.warn { "warn log" }
162
- log.error { "error log" }
163
- log.fatal { "fatal log" }
164
- expected = [
165
- "#{@timestamp_str} [trace]: trace log\n",
166
- "#{@timestamp_str} [debug]: debug log\n",
167
- "#{@timestamp_str} [info]: info log\n",
168
- "#{@timestamp_str} [warn]: warn log\n",
169
- "#{@timestamp_str} [error]: error log\n",
170
- "#{@timestamp_str} [fatal]: fatal log\n"
171
- ][start..-1]
172
- assert_equal(expected, log.out.logs)
173
- end
174
-
175
- data(
176
- trace: [Fluent::Log::LEVEL_TRACE, { trace: true, debug: true, info: true, warn: true, error: true, fatal: true }],
177
- debug: [Fluent::Log::LEVEL_DEBUG, { trace: false, debug: true, info: true, warn: true, error: true, fatal: true }],
178
- info: [Fluent::Log::LEVEL_INFO, { trace: false, debug: false, info: true, warn: true, error: true, fatal: true }],
179
- warn: [Fluent::Log::LEVEL_WARN, { trace: false, debug: false, info: false, warn: true, error: true, fatal: true }],
180
- error: [Fluent::Log::LEVEL_ERROR, { trace: false, debug: false, info: false, warn: false, error: true, fatal: true }],
181
- fatal: [Fluent::Log::LEVEL_FATAL, { trace: false, debug: false, info: false, warn: false, error: false, fatal: true }],
182
- )
183
- def test_execute_block(data)
184
- log_level, expected = data
185
- logdev = @log_device
186
- logger = ServerEngine::DaemonLogger.new(logdev)
187
- log = Fluent::Log.new(logger)
188
- log.level = log_level
189
- block_called = {
190
- trace: false,
191
- debug: false,
192
- info: false,
193
- warn: false,
194
- error: false,
195
- fatal: false,
196
- }
197
- log.trace { block_called[:trace] = true }
198
- log.debug { block_called[:debug] = true }
199
- log.info { block_called[:info] = true }
200
- log.warn { block_called[:warn] = true }
201
- log.error { block_called[:error] = true }
202
- log.fatal { block_called[:fatal] = true }
203
- assert_equal(expected, block_called)
204
- end
205
-
206
- data(
207
- trace: [ServerEngine::DaemonLogger::TRACE, { trace: true, debug: true, info: true, warn: true, error: true, fatal: true }],
208
- debug: [ServerEngine::DaemonLogger::DEBUG, { trace: false, debug: true, info: true, warn: true, error: true, fatal: true }],
209
- info: [ServerEngine::DaemonLogger::INFO, { trace: false, debug: false, info: true, warn: true, error: true, fatal: true }],
210
- warn: [ServerEngine::DaemonLogger::WARN, { trace: false, debug: false, info: false, warn: true, error: true, fatal: true }],
211
- error: [ServerEngine::DaemonLogger::ERROR, { trace: false, debug: false, info: false, warn: false, error: true, fatal: true }],
212
- fatal: [ServerEngine::DaemonLogger::FATAL, { trace: false, debug: false, info: false, warn: false, error: false, fatal: true }],
213
- )
214
- def test_execute_block_with_serverengine_loglevel(data)
215
- log_level, expected = data
216
- dl_opts = {}
217
- dl_opts[:log_level] = log_level
218
- logdev = @log_device
219
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
220
- log = Fluent::Log.new(logger)
221
- block_called = {
222
- trace: false,
223
- debug: false,
224
- info: false,
225
- warn: false,
226
- error: false,
227
- fatal: false,
228
- }
229
- log.trace { block_called[:trace] = true }
230
- log.debug { block_called[:debug] = true }
231
- log.info { block_called[:info] = true }
232
- log.warn { block_called[:warn] = true }
233
- log.error { block_called[:error] = true }
234
- log.fatal { block_called[:fatal] = true }
235
- assert_equal(expected, block_called)
236
- end
237
-
238
- data(
239
- trace: [Fluent::Log::LEVEL_TRACE, 0],
240
- debug: [Fluent::Log::LEVEL_DEBUG, 3],
241
- info: [Fluent::Log::LEVEL_INFO, 6],
242
- warn: [Fluent::Log::LEVEL_WARN, 9],
243
- error: [Fluent::Log::LEVEL_ERROR, 12],
244
- fatal: [Fluent::Log::LEVEL_FATAL, 15],
245
- )
246
- def test_backtrace(data)
247
- log_level, start = data
248
- backtrace = ["line 1", "line 2", "line 3"]
249
- logdev = @log_device
250
- logger = ServerEngine::DaemonLogger.new(logdev)
251
- log = Fluent::Log.new(logger)
252
- log.level = log_level
253
- log.trace_backtrace(backtrace)
254
- log.debug_backtrace(backtrace)
255
- log.info_backtrace(backtrace)
256
- log.warn_backtrace(backtrace)
257
- log.error_backtrace(backtrace)
258
- log.fatal_backtrace(backtrace)
259
- expected = [
260
- " #{@timestamp_str} [trace]: line 1\n",
261
- " #{@timestamp_str} [trace]: line 2\n",
262
- " #{@timestamp_str} [trace]: line 3\n",
263
- " #{@timestamp_str} [debug]: line 1\n",
264
- " #{@timestamp_str} [debug]: line 2\n",
265
- " #{@timestamp_str} [debug]: line 3\n",
266
- " #{@timestamp_str} [info]: line 1\n",
267
- " #{@timestamp_str} [info]: line 2\n",
268
- " #{@timestamp_str} [info]: line 3\n",
269
- " #{@timestamp_str} [warn]: line 1\n",
270
- " #{@timestamp_str} [warn]: line 2\n",
271
- " #{@timestamp_str} [warn]: line 3\n",
272
- " #{@timestamp_str} [error]: line 1\n",
273
- " #{@timestamp_str} [error]: line 2\n",
274
- " #{@timestamp_str} [error]: line 3\n",
275
- " #{@timestamp_str} [fatal]: line 1\n",
276
- " #{@timestamp_str} [fatal]: line 2\n",
277
- " #{@timestamp_str} [fatal]: line 3\n"
278
- ][start..-1]
279
- assert_equal(expected, log.out.logs)
280
- end
281
-
282
- data(
283
- trace: [ServerEngine::DaemonLogger::TRACE, 0],
284
- debug: [ServerEngine::DaemonLogger::DEBUG, 3],
285
- info: [ServerEngine::DaemonLogger::INFO, 6],
286
- warn: [ServerEngine::DaemonLogger::WARN, 9],
287
- error: [ServerEngine::DaemonLogger::ERROR, 12],
288
- fatal: [ServerEngine::DaemonLogger::FATAL, 15],
289
- )
290
- def test_backtrace_with_serverengine_loglevel(data)
291
- log_level, start = data
292
- backtrace = ["line 1", "line 2", "line 3"]
293
- dl_opts = {}
294
- dl_opts[:log_level] = log_level
295
- logdev = @log_device
296
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
297
- log = Fluent::Log.new(logger)
298
- log.trace_backtrace(backtrace)
299
- log.debug_backtrace(backtrace)
300
- log.info_backtrace(backtrace)
301
- log.warn_backtrace(backtrace)
302
- log.error_backtrace(backtrace)
303
- log.fatal_backtrace(backtrace)
304
- expected = [
305
- " #{@timestamp_str} [trace]: line 1\n",
306
- " #{@timestamp_str} [trace]: line 2\n",
307
- " #{@timestamp_str} [trace]: line 3\n",
308
- " #{@timestamp_str} [debug]: line 1\n",
309
- " #{@timestamp_str} [debug]: line 2\n",
310
- " #{@timestamp_str} [debug]: line 3\n",
311
- " #{@timestamp_str} [info]: line 1\n",
312
- " #{@timestamp_str} [info]: line 2\n",
313
- " #{@timestamp_str} [info]: line 3\n",
314
- " #{@timestamp_str} [warn]: line 1\n",
315
- " #{@timestamp_str} [warn]: line 2\n",
316
- " #{@timestamp_str} [warn]: line 3\n",
317
- " #{@timestamp_str} [error]: line 1\n",
318
- " #{@timestamp_str} [error]: line 2\n",
319
- " #{@timestamp_str} [error]: line 3\n",
320
- " #{@timestamp_str} [fatal]: line 1\n",
321
- " #{@timestamp_str} [fatal]: line 2\n",
322
- " #{@timestamp_str} [fatal]: line 3\n"
323
- ][start..-1]
324
- assert_equal(expected, log.out.logs)
325
- end
326
- end
327
-
328
- sub_test_case "suppress repeated backtrace" do
329
- def test_same_log_level
330
- backtrace = ["line 1", "line 2", "line 3"]
331
- dl_opts = {}
332
- dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
333
- logdev = @log_device
334
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
335
- opts = {}
336
- opts[:suppress_repeated_stacktrace] = true
337
- log = Fluent::Log.new(logger, opts)
338
- log.trace_backtrace(backtrace)
339
- log.trace_backtrace(backtrace)
340
- log.trace_backtrace(backtrace + ["line 4"])
341
- log.trace_backtrace(backtrace)
342
- log.trace_backtrace(backtrace)
343
- expected = [
344
- " #{@timestamp_str} [trace]: line 1\n",
345
- " #{@timestamp_str} [trace]: line 2\n",
346
- " #{@timestamp_str} [trace]: line 3\n",
347
- " #{@timestamp_str} [trace]: suppressed same stacktrace\n",
348
- " #{@timestamp_str} [trace]: line 1\n",
349
- " #{@timestamp_str} [trace]: line 2\n",
350
- " #{@timestamp_str} [trace]: line 3\n",
351
- " #{@timestamp_str} [trace]: line 4\n",
352
- " #{@timestamp_str} [trace]: line 1\n",
353
- " #{@timestamp_str} [trace]: line 2\n",
354
- " #{@timestamp_str} [trace]: line 3\n",
355
- " #{@timestamp_str} [trace]: suppressed same stacktrace\n",
356
- ]
357
- assert_equal(expected, log.out.logs)
358
- end
359
-
360
- def test_different_log_level
361
- backtrace = ["line 1", "line 2", "line 3"]
362
- dl_opts = {}
363
- dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
364
- logdev = @log_device
365
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
366
- opts = {}
367
- opts[:suppress_repeated_stacktrace] = true
368
- log = Fluent::Log.new(logger, opts)
369
- log.trace_backtrace(backtrace)
370
- log.debug_backtrace(backtrace)
371
- log.info_backtrace(backtrace)
372
- log.warn_backtrace(backtrace)
373
- log.error_backtrace(backtrace)
374
- log.fatal_backtrace(backtrace)
375
- expected = [
376
- " #{@timestamp_str} [trace]: line 1\n",
377
- " #{@timestamp_str} [trace]: line 2\n",
378
- " #{@timestamp_str} [trace]: line 3\n",
379
- " #{@timestamp_str} [debug]: suppressed same stacktrace\n",
380
- " #{@timestamp_str} [info]: suppressed same stacktrace\n",
381
- " #{@timestamp_str} [warn]: suppressed same stacktrace\n",
382
- " #{@timestamp_str} [error]: suppressed same stacktrace\n",
383
- " #{@timestamp_str} [fatal]: suppressed same stacktrace\n",
384
- ]
385
- assert_equal(expected, log.out.logs)
386
- end
387
- end
388
-
389
- sub_test_case "ignore_repeated_log_interval" do
390
- def test_same_message
391
- message = "This is test"
392
- logger = ServerEngine::DaemonLogger.new(@log_device, {log_level: ServerEngine::DaemonLogger::INFO})
393
- log = Fluent::Log.new(logger, {ignore_repeated_log_interval: 5})
394
-
395
- log.error message
396
- 10.times { |i|
397
- Timecop.freeze(@timestamp + i)
398
- log.error message
399
- }
400
-
401
- expected = [
402
- "2016-04-21 02:58:41 +0000 [error]: This is test\n",
403
- "2016-04-21 02:58:47 +0000 [error]: This is test\n"
404
- ]
405
- assert_equal(expected, log.out.logs)
406
- end
407
-
408
- def test_different_message
409
- message = "This is test"
410
- logger = ServerEngine::DaemonLogger.new(@log_device, {log_level: ServerEngine::DaemonLogger::INFO})
411
- log = Fluent::Log.new(logger, {ignore_repeated_log_interval: 10})
412
-
413
- log.error message
414
- 3.times { |i|
415
- Timecop.freeze(@timestamp + i)
416
- log.error message
417
- log.error message
418
- log.info "Hello! " + message
419
- }
420
-
421
- expected = [
422
- "2016-04-21 02:58:41 +0000 [error]: This is test\n",
423
- "2016-04-21 02:58:41 +0000 [info]: Hello! This is test\n",
424
- "2016-04-21 02:58:42 +0000 [error]: This is test\n",
425
- "2016-04-21 02:58:42 +0000 [info]: Hello! This is test\n",
426
- "2016-04-21 02:58:43 +0000 [error]: This is test\n",
427
- "2016-04-21 02:58:43 +0000 [info]: Hello! This is test\n",
428
- ]
429
- assert_equal(expected, log.out.logs)
430
- end
431
- end
432
-
433
- sub_test_case "ignore_same_log_interval" do
434
- teardown do
435
- Thread.current[:last_same_log] = nil
436
- end
437
-
438
- def test_same_message
439
- message = "This is test"
440
- logger = ServerEngine::DaemonLogger.new(@log_device, {log_level: ServerEngine::DaemonLogger::INFO})
441
- log = Fluent::Log.new(logger, {ignore_same_log_interval: 5})
442
-
443
- log.error message
444
- 10.times { |i|
445
- Timecop.freeze(@timestamp + i + 1)
446
- log.error message
447
- }
448
-
449
- expected = [
450
- "2016-04-21 02:58:41 +0000 [error]: This is test\n",
451
- "2016-04-21 02:58:47 +0000 [error]: This is test\n"
452
- ]
453
- assert_equal(expected, log.out.logs)
454
- end
455
-
456
- def test_different_message
457
- message = "This is test"
458
- logger = ServerEngine::DaemonLogger.new(@log_device, {log_level: ServerEngine::DaemonLogger::INFO})
459
- log = Fluent::Log.new(logger, {ignore_same_log_interval: 10})
460
-
461
- log.error message
462
- 3.times { |i|
463
- Timecop.freeze(@timestamp + i)
464
- log.error message
465
- log.error message
466
- log.info "Hello! " + message
467
- }
468
-
469
- expected = [
470
- "2016-04-21 02:58:41 +0000 [error]: This is test\n",
471
- "2016-04-21 02:58:41 +0000 [info]: Hello! This is test\n",
472
- ]
473
- assert_equal(expected, log.out.logs)
474
- end
475
-
476
- def test_reject_on_max_size
477
- ignore_same_log_interval = 10
478
-
479
- logger = Fluent::Log.new(
480
- ServerEngine::DaemonLogger.new(@log_device, log_level: ServerEngine::DaemonLogger::INFO),
481
- ignore_same_log_interval: ignore_same_log_interval,
482
- )
483
-
484
- # Output unique log every second.
485
- Fluent::Log::IGNORE_SAME_LOG_MAX_CACHE_SIZE.times do |i|
486
- logger.info "Test #{i}"
487
- Timecop.freeze(@timestamp + i)
488
- end
489
- logger.info "Over max size!"
490
-
491
- # The newest cache and the latest caches in `ignore_same_log_interval` should exist.
492
- assert { Thread.current[:last_same_log].size == ignore_same_log_interval + 1 }
493
- end
494
-
495
- def test_clear_on_max_size
496
- ignore_same_log_interval = 10
497
-
498
- logger = Fluent::Log.new(
499
- ServerEngine::DaemonLogger.new(@log_device, log_level: ServerEngine::DaemonLogger::INFO),
500
- ignore_same_log_interval: ignore_same_log_interval,
501
- )
502
-
503
- # Output unique log at the same time.
504
- Fluent::Log::IGNORE_SAME_LOG_MAX_CACHE_SIZE.times do |i|
505
- logger.info "Test #{i}"
506
- end
507
- logger.info "Over max size!"
508
-
509
- # Can't reject old logs, so all cache should be cleared and only the newest should exist.
510
- assert { Thread.current[:last_same_log].size == 1 }
511
- end
512
- end
513
-
514
- def test_dup
515
- dl_opts = {}
516
- dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
517
- logdev = @log_device
518
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
519
- log1 = Fluent::Log.new(logger)
520
- log2 = log1.dup
521
- log1.level = Fluent::Log::LEVEL_DEBUG
522
- assert_equal(Fluent::Log::LEVEL_DEBUG, log1.level)
523
- assert_equal(Fluent::Log::LEVEL_TRACE, log2.level)
524
- end
525
-
526
- def test_format_json
527
- logdev = @log_device
528
- logger = ServerEngine::DaemonLogger.new(logdev)
529
- log = Fluent::Log.new(logger)
530
- log.format = :json
531
- log.level = Fluent::Log::LEVEL_TRACE
532
- log.trace "trace log"
533
- log.debug "debug log"
534
- log.info "info log"
535
- log.warn "warn log"
536
- log.error "error log"
537
- log.fatal "fatal log"
538
- expected = [
539
- "#{@timestamp_str} [trace]: trace log\n",
540
- "#{@timestamp_str} [debug]: debug log\n",
541
- "#{@timestamp_str} [info]: info log\n",
542
- "#{@timestamp_str} [warn]: warn log\n",
543
- "#{@timestamp_str} [error]: error log\n",
544
- "#{@timestamp_str} [fatal]: fatal log\n"
545
- ]
546
- assert_equal(expected, log.out.logs.map { |l|
547
- r = JSON.parse(l)
548
- "#{r['time']} [#{r['level']}]: #{r['message']}\n"
549
- })
550
- end
551
-
552
- def test_time_format
553
- logdev = @log_device
554
- logger = ServerEngine::DaemonLogger.new(logdev)
555
- log = Fluent::Log.new(logger)
556
- log.time_format = "%Y"
557
- log.level = Fluent::Log::LEVEL_TRACE
558
- log.trace "trace log"
559
- log.debug "debug log"
560
- log.info "info log"
561
- log.warn "warn log"
562
- log.error "error log"
563
- log.fatal "fatal log"
564
- timestamp_str = @timestamp.strftime("%Y")
565
- expected = [
566
- "#{timestamp_str} [trace]: trace log\n",
567
- "#{timestamp_str} [debug]: debug log\n",
568
- "#{timestamp_str} [info]: info log\n",
569
- "#{timestamp_str} [warn]: warn log\n",
570
- "#{timestamp_str} [error]: error log\n",
571
- "#{timestamp_str} [fatal]: fatal log\n"
572
- ]
573
- assert_equal(expected, log.out.logs)
574
- end
575
-
576
- def test_disable_events
577
- dl_opts = {}
578
- dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
579
- logdev = @log_device
580
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
581
- log = Fluent::Log.new(logger)
582
- log.enable_event(true)
583
- engine = log.instance_variable_get("@engine")
584
- mock(engine).push_log_event(anything, anything, anything).once
585
- log.trace "trace log"
586
- log.disable_events(Thread.current)
587
- log.trace "trace log"
588
- end
589
-
590
- def test_level_reload
591
- dl_opts = {}
592
- dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
593
- logdev = @log_device
594
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
595
- log = Fluent::Log.new(logger)
596
- assert_equal(ServerEngine::DaemonLogger::TRACE, logger.level)
597
- assert_equal(Fluent::Log::LEVEL_TRACE, log.level)
598
- # change daemon logger side level
599
- logger.level = ServerEngine::DaemonLogger::DEBUG
600
- assert_equal(ServerEngine::DaemonLogger::DEBUG, logger.level)
601
- # check fluentd log side level is also changed
602
- assert_equal(Fluent::Log::LEVEL_DEBUG, log.level)
603
- end
604
-
605
- DAY_SEC = 60 * 60 * 24
606
- data(
607
- rotate_daily_age: ['daily', 100000, DAY_SEC + 1],
608
- rotate_weekly_age: ['weekly', 100000, DAY_SEC * 7 + 1],
609
- rotate_monthly_age: ['monthly', 100000, DAY_SEC * 31 + 1],
610
- rotate_size: [1, 100, 0, '0'],
611
- )
612
- def test_log_with_logdevio(expected)
613
- with_timezone('utc') do
614
- @timestamp = Time.parse("2016-04-21 00:00:00 +0000")
615
- @timestamp_str = @timestamp.strftime("%Y-%m-%d %H:%M:%S %z")
616
- Timecop.freeze(@timestamp)
617
-
618
- rotate_age, rotate_size, travel_term = expected
619
- path = "#{@tmp_dir}/log-dev-io-#{rotate_size}-#{rotate_age}"
620
-
621
- logdev = Fluent::LogDeviceIO.new(path, shift_age: rotate_age, shift_size: rotate_size)
622
- logger = ServerEngine::DaemonLogger.new(logdev)
623
- log = Fluent::Log.new(logger)
624
-
625
- msg = 'a' * 101
626
- log.info msg
627
- assert_match msg, File.read(path)
628
-
629
- Timecop.freeze(@timestamp + travel_term)
630
-
631
- msg2 = 'b' * 101
632
- log.info msg2
633
- c = File.read(path)
634
-
635
- assert_match msg2, c
636
- assert_not_equal msg, c
637
- end
638
- end
639
-
640
- def test_log_rotates_specified_size_with_logdevio
641
- with_timezone('utc') do
642
- begin
643
- rotate_age = 2
644
- rotate_size = 100
645
- path = "#{@tmp_dir}/log-dev-io-#{rotate_size}-#{rotate_age}"
646
- path0 = path + '.0'
647
- path1 = path + '.1'
648
-
649
- logdev = Fluent::LogDeviceIO.new(path, shift_age: rotate_age, shift_size: rotate_size)
650
- logger = ServerEngine::DaemonLogger.new(logdev)
651
- log = Fluent::Log.new(logger)
652
-
653
- msg = 'a' * 101
654
- log.info msg
655
- assert_match msg, File.read(path)
656
- assert_true File.exist?(path)
657
- assert_true !File.exist?(path0)
658
- assert_true !File.exist?(path1)
659
-
660
- # create log.0
661
- msg2 = 'b' * 101
662
- log.info msg2
663
- c = File.read(path)
664
- c0 = File.read(path0)
665
- assert_match msg2, c
666
- assert_match msg, c0
667
- assert_true File.exist?(path)
668
- assert_true File.exist?(path0)
669
- assert_true !File.exist?(path1)
670
-
671
- # rotate
672
- msg3 = 'c' * 101
673
- log.info msg3
674
- c = File.read(path)
675
- c0 = File.read(path0)
676
- assert_match msg3, c
677
- assert_match msg2, c0
678
- assert_true File.exist?(path)
679
- assert_true File.exist?(path0)
680
- assert_true !File.exist?(path1)
681
- ensure
682
- logdev&.close
683
- end
684
- end
685
- end
686
-
687
- def test_reopen
688
- path = Pathname(@tmp_dir) + "fluent.log"
689
-
690
- logdev = Fluent::LogDeviceIO.new(path.to_s)
691
- logger = ServerEngine::DaemonLogger.new(logdev)
692
- log = Fluent::Log.new(logger, path: path)
693
-
694
- message = "This is test message."
695
-
696
- log.info message
697
- log.reopen!
698
- log.info message
699
-
700
- assert { path.read.lines.count{ |line| line.include?(message) } == 2 }
701
- # Assert reopening the same file.
702
- # Especially, on Windows, the filepath is fixed for each process with rotate,
703
- # so we need to care about this.
704
- assert { path.parent.entries.size == 3 } # [".", "..", "fluent.log"]
705
- ensure
706
- logdev&.close
707
- end
708
- end
709
-
710
- class PluginLoggerTest < Test::Unit::TestCase
711
- def setup
712
- @log_device = Fluent::Test::DummyLogDevice.new
713
- @timestamp = Time.parse("2016-04-21 02:58:41 +0000")
714
- @timestamp_str = @timestamp.strftime("%Y-%m-%d %H:%M:%S %z")
715
- Timecop.freeze(@timestamp)
716
- dl_opts = {}
717
- dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
718
- logdev = @log_device
719
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
720
- @logger = Fluent::Log.new(logger)
721
- end
722
-
723
- def teardown
724
- @log_device.reset
725
- Timecop.return
726
- Thread.current[:last_repeated_stacktrace] = nil
727
- end
728
-
729
- def test_initialize
730
- log = Fluent::PluginLogger.new(@logger)
731
- logger = log.instance_variable_get("@logger")
732
- assert_equal(logger, @logger)
733
- end
734
-
735
- def test_level
736
- log = Fluent::PluginLogger.new(@logger)
737
- assert_equal(log.level, @logger.level)
738
- log.level = "fatal"
739
- assert_equal(Fluent::Log::LEVEL_FATAL, log.level)
740
- assert_equal(Fluent::Log::LEVEL_TRACE, @logger.level)
741
- end
742
-
743
- def test_enable_color
744
- log = Fluent::PluginLogger.new(@logger)
745
- log.enable_color(true)
746
- assert_equal(true, log.enable_color?)
747
- assert_equal(true, @logger.enable_color?)
748
- log.enable_color(false)
749
- assert_equal(false, log.enable_color?)
750
- assert_equal(false, @logger.enable_color?)
751
- log.enable_color
752
- assert_equal(true, log.enable_color?)
753
- assert_equal(true, @logger.enable_color?)
754
- end
755
-
756
- def test_log_type_in_default
757
- mock(@logger).caller_line(:default, Time.now, 1, Fluent::Log::LEVEL_TRACE).once
758
- mock(@logger).caller_line(:default, Time.now, 1, Fluent::Log::LEVEL_DEBUG).once
759
- mock(@logger).caller_line(:default, Time.now, 1, Fluent::Log::LEVEL_INFO).once
760
- mock(@logger).caller_line(:default, Time.now, 1, Fluent::Log::LEVEL_WARN).once
761
- mock(@logger).caller_line(:default, Time.now, 1, Fluent::Log::LEVEL_ERROR).once
762
- mock(@logger).caller_line(:default, Time.now, 1, Fluent::Log::LEVEL_FATAL).once
763
-
764
- @logger.trace "trace log 1"
765
- @logger.debug "debug log 2"
766
- @logger.info "info log 3"
767
- @logger.warn "warn log 4"
768
- @logger.error "error log 5"
769
- @logger.fatal "fatal log 6"
770
- end
771
-
772
- def test_log_types
773
- mock(@logger).caller_line(:default, Time.now, 1, Fluent::Log::LEVEL_TRACE).once
774
- mock(@logger).caller_line(:supervisor, Time.now, 1, Fluent::Log::LEVEL_DEBUG).once
775
- mock(@logger).caller_line(:worker0, Time.now, 1, Fluent::Log::LEVEL_INFO).once
776
- mock(@logger).caller_line(:default, Time.now, 1, Fluent::Log::LEVEL_WARN).once
777
- mock(@logger).caller_line(:supervisor, Time.now, 1, Fluent::Log::LEVEL_ERROR).once
778
- mock(@logger).caller_line(:worker0, Time.now, 1, Fluent::Log::LEVEL_FATAL).once
779
-
780
- @logger.trace :default, "trace log 1"
781
- @logger.debug :supervisor, "debug log 2"
782
- @logger.info :worker0, "info log 3"
783
- @logger.warn :default, "warn log 4"
784
- @logger.error :supervisor, "error log 5"
785
- @logger.fatal :worker0, "fatal log 6"
786
- end
787
-
788
- sub_test_case "supervisor process type" do
789
- setup do
790
- dl_opts = {}
791
- dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
792
- logdev = @log_device
793
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
794
- @logger = Fluent::Log.new(logger, process_type: :supervisor)
795
- end
796
-
797
- test 'default type logs are shown w/o worker id' do
798
- @logger.info "yaaay"
799
- @logger.info :default, "booo"
800
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: yaaay\n") }
801
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: booo\n") }
802
- end
803
-
804
- test 'supervisor type logs are shown w/o worker id' do
805
- @logger.info :supervisor, "yaaay"
806
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: yaaay\n") }
807
- end
808
-
809
- test 'worker0 type logs are not shown' do
810
- @logger.info :worker0, "yaaay"
811
- assert{ !@log_device.logs.include?("#{@timestamp_str} [info]: yaaay\n") }
812
- end
813
- end
814
-
815
- sub_test_case "worker0 process type" do
816
- setup do
817
- dl_opts = {}
818
- dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
819
- logdev = @log_device
820
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
821
- @logger = Fluent::Log.new(logger, process_type: :worker0, worker_id: 10)
822
- end
823
-
824
- test 'default type logs are shown w/ worker id' do
825
- @logger.info "yaaay"
826
- @logger.info :default, "booo"
827
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: #10 yaaay\n") }
828
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: #10 booo\n") }
829
- end
830
-
831
- test 'supervisor type logs are not shown' do
832
- @logger.info :supervisor, "yaaay"
833
- assert{ !@log_device.logs.include?("#{@timestamp_str} [info]: yaaay\n") }
834
- end
835
-
836
- test 'worker0 type logs are shown w/o worker id' do
837
- @logger.info :worker0, "yaaay"
838
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: yaaay\n") }
839
- end
840
- end
841
-
842
- sub_test_case "workers process type" do
843
- setup do
844
- dl_opts = {}
845
- dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
846
- logdev = @log_device
847
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
848
- @logger = Fluent::Log.new(logger, process_type: :workers, worker_id: 7)
849
- end
850
-
851
- test 'default type logs are shown w/ worker id' do
852
- @logger.info "yaaay"
853
- @logger.info :default, "booo"
854
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: #7 yaaay\n") }
855
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: #7 booo\n") }
856
- end
857
-
858
- test 'supervisor type logs are not shown' do
859
- @logger.info :supervisor, "yaaay"
860
- assert{ !@log_device.logs.include?("#{@timestamp_str} [info]: yaaay\n") }
861
- end
862
-
863
- test 'worker0 type logs are not shown' do
864
- @logger.info :worker0, "yaaay"
865
- assert{ !@log_device.logs.include?("#{@timestamp_str} [info]: yaaay\n") }
866
- end
867
- end
868
-
869
- sub_test_case "standalone process type" do
870
- setup do
871
- dl_opts = {}
872
- dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
873
- logdev = @log_device
874
- logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
875
- @logger = Fluent::Log.new(logger, process_type: :standalone, worker_id: 0)
876
- end
877
-
878
- test 'default type logs are shown w/o worker id' do
879
- @logger.info "yaaay"
880
- @logger.info :default, "booo"
881
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: yaaay\n") }
882
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: booo\n") }
883
- end
884
-
885
- test 'supervisor type logs are shown w/o worker id' do
886
- @logger.info :supervisor, "yaaay"
887
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: yaaay\n") }
888
- end
889
-
890
- test 'worker0 type logs are shown w/o worker id' do
891
- @logger.info :worker0, "yaaay"
892
- assert{ @log_device.logs.include?("#{@timestamp_str} [info]: yaaay\n") }
893
- end
894
- end
895
-
896
- sub_test_case "delegators" do
897
- def setup
898
- super
899
- @log = Fluent::PluginLogger.new(@logger)
900
- end
901
-
902
- def test_enable_debug
903
- mock(@logger).enable_debug
904
- @log.enable_debug
905
- end
906
-
907
- def test_enable_event
908
- mock(@logger).enable_event
909
- @log.enable_event
910
- end
911
-
912
- def test_disable_events
913
- mock(@logger).disable_events(Thread.current)
914
- @log.disable_events(Thread.current)
915
- end
916
-
917
- def test_event
918
- mock(@logger).event(Fluent::Log::LEVEL_TRACE, { key: "value" })
919
- @log.event(Fluent::Log::LEVEL_TRACE, { key: "value" })
920
- end
921
-
922
- def test_caller_line
923
- mock(@logger).caller_line(Time.now, 1, Fluent::Log::LEVEL_TRACE)
924
- @log.caller_line(Time.now, 1, Fluent::Log::LEVEL_TRACE)
925
- end
926
-
927
- def test_puts
928
- mock(@logger).puts("log")
929
- @log.puts("log")
930
- end
931
-
932
- def test_write
933
- mock(@logger).write("log")
934
- @log.write("log")
935
- end
936
-
937
- def test_write_alias
938
- assert(@log.respond_to?(:<<))
939
- mock(@log.out).write("log")
940
- @log << "log"
941
- end
942
-
943
- def test_out
944
- assert_equal(@log.out, @logger.out)
945
- @log.out = Object.new
946
- assert_equal(@log.out, @logger.out)
947
- end
948
-
949
- def test_optional_header
950
- assert_equal(@log.optional_header, @logger.optional_header)
951
- @log.optional_header = "optional_header"
952
- assert_equal(@log.optional_header, @logger.optional_header)
953
- end
954
-
955
- def test_optional_attrs
956
- assert_equal(@log.optional_attrs, @logger.optional_attrs)
957
- @log.optional_attrs = "optional_attrs"
958
- assert_equal(@log.optional_attrs, @logger.optional_attrs)
959
- end
960
- end
961
-
962
- sub_test_case "partially delegated" do
963
- def setup
964
- super
965
- @log = Fluent::PluginLogger.new(@logger)
966
- end
967
-
968
- data(
969
- text: [:text, "2016-04-21 02:58:41 +0000 [info]: yaaay\n"],
970
- json: [:json, %Q({"time":"2016-04-21 02:58:41 +0000","level":"info","message":"yaaay"}\n)],
971
- )
972
- def test_format(data)
973
- fmt, expected_log_line = data
974
- with_timezone('utc') {
975
- @log.format = fmt
976
- @log.info "yaaay"
977
- }
978
- assert{ @log_device.logs.include? expected_log_line }
979
- end
980
-
981
- data(
982
- text: [:text, "2016 [info]: yaaay\n"],
983
- json: [:json, %Q({"time":"2016","level":"info","message":"yaaay"}\n)],
984
- )
985
- def test_time_format(data)
986
- fmt, expected_log_line = data
987
- @log.format = fmt
988
- @log.time_format = "%Y"
989
- @log.info "yaaay"
990
- assert{ @log_device.logs.include? expected_log_line }
991
- end
992
- end
993
- end
994
-
995
- class PluginLoggerMixinTest < Test::Unit::TestCase
996
- class DummyPlugin < Fluent::Plugin::Input
997
- end
998
-
999
- def create_driver(conf)
1000
- Fluent::Test::Driver::Input.new(DummyPlugin).configure(conf)
1001
- end
1002
-
1003
- def setup
1004
- Fluent::Test.setup
1005
- end
1006
-
1007
- def test_default_log
1008
- plugin = DummyPlugin.new
1009
- log = plugin.log
1010
- assert_equal($log, log)
1011
- end
1012
-
1013
- def test_log_level
1014
- d = create_driver(%[log_level fatal])
1015
- log = d.instance.log
1016
- assert_not_equal($log.level, log.level)
1017
- assert_equal(Fluent::Log::LEVEL_FATAL, log.level)
1018
- end
1019
-
1020
- def test_optional_header
1021
- d = create_driver(%[@id myplugin])
1022
- log = d.instance.log
1023
- assert_equal("[myplugin] ", log.optional_header)
1024
- assert_equal({}, log.optional_attrs)
1025
- end
1026
-
1027
- def test_start
1028
- plugin = DummyPlugin.new
1029
- mock(plugin.log).should_receive(:reset).never
1030
- plugin.start
1031
- end
1032
-
1033
- def test_terminate
1034
- plugin = DummyPlugin.new
1035
- mock(plugin.log).reset
1036
- plugin.terminate
1037
- end
1038
- end
1039
-
1040
- class LogDeviceIOTest < Test::Unit::TestCase
1041
- test 'flush' do
1042
- io = StringIO.new
1043
- logdev = Fluent::LogDeviceIO.new(io)
1044
- assert_equal io, logdev.flush
1045
-
1046
- io.instance_eval { undef :flush }
1047
- logdev = Fluent::LogDeviceIO.new(io)
1048
- assert_raise NoMethodError do
1049
- logdev.flush
1050
- end
1051
- end
1052
-
1053
- test 'tty?' do
1054
- io = StringIO.new
1055
- logdev = Fluent::LogDeviceIO.new(io)
1056
- assert_equal io.tty?, logdev.tty?
1057
-
1058
- io.instance_eval { undef :tty? }
1059
- logdev = Fluent::LogDeviceIO.new(io)
1060
- assert_raise NoMethodError do
1061
- logdev.tty?
1062
- end
1063
- end
1064
-
1065
- test 'sync=' do
1066
- io = StringIO.new
1067
- logdev = Fluent::LogDeviceIO.new(io)
1068
- assert_true logdev.sync = true
1069
-
1070
- io.instance_eval { undef :sync= }
1071
- logdev = Fluent::LogDeviceIO.new(io)
1072
- assert_raise NoMethodError do
1073
- logdev.sync = true
1074
- end
1075
- end
1076
- end