This is an automated email from the ASF dual-hosted git repository.

spacewander pushed a commit to branch release/2.15
in repository https://gitbox.apache.org/repos/asf/apisix.git

commit c6c32e771a8db7730272668855c0b249a04b3fc4
Author: levy liu <[email protected]>
AuthorDate: Wed Nov 23 11:23:52 2022 +0800

    fix(file-loger): use no buffering model when open file (#7884)
    
    Fixes https://github.com/apache/apisix/issues/7839
---
 apisix/plugins/file-logger.lua | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/apisix/plugins/file-logger.lua b/apisix/plugins/file-logger.lua
index e624b0bbc..9fbe359a7 100644
--- a/apisix/plugins/file-logger.lua
+++ b/apisix/plugins/file-logger.lua
@@ -75,6 +75,9 @@ if is_apisix_or then
             return nil, err
         end
 
+        -- it will case output problem with buffer when log is larger than 
buffer
+        file:setvbuf("no")
+
         handler.file = file
         handler.open_time = ngx.now() * 1000
         return handler
@@ -116,11 +119,14 @@ local function write_file_data(conf, log_message)
     if not file then
         core.log.error("failed to open file: ", conf.path, ", error info: ", 
err)
     else
-        local ok, err = file:write(msg, '\n')
+        -- file:write(msg, "\n") will call fwrite several times
+        -- which will cause problem with the log output
+        -- it should be atomic
+        msg = msg .. "\n"
+        -- write to file directly, no need flush
+        local ok, err = file:write(msg)
         if not ok then
             core.log.error("failed to write file: ", conf.path, ", error info: 
", err)
-        else
-            file:flush()
         end
 
         -- file will be closed by gc, if open_file_cache exists

Reply via email to