fix(loki-logger): nil context in batch processor (#9850)

diff --git a/apisix/plugins/loki-logger.lua b/apisix/plugins/loki-logger.lua
index 593fc8b..357ab19 100644
--- a/apisix/plugins/loki-logger.lua
+++ b/apisix/plugins/loki-logger.lua
@@ -192,18 +192,18 @@
         return
     end
 
+    local labels = conf.log_labels
+
+    -- parsing possible variables in label value
+    for key, value in pairs(labels) do
+        local new_val, err, n_resolved = core.utils.resolve_var(value, ctx.var)
+        if not err and n_resolved > 0 then
+            labels[key] = new_val
+        end
+    end
+
     -- generate a function to be executed by the batch processor
     local func = function(entries)
-        local labels = conf.log_labels
-
-        -- parsing possible variables in label value
-        for key, value in pairs(labels) do
-            local new_val, err, n_resolved = core.utils.resolve_var(value, ctx.var)
-            if not err and n_resolved > 0 then
-                labels[key] = new_val
-            end
-        end
-
         -- build loki request data
         local data = {
             streams = {
diff --git a/t/plugin/loki-logger.t b/t/plugin/loki-logger.t
index faa8749..72c79f1 100644
--- a/t/plugin/loki-logger.t
+++ b/t/plugin/loki-logger.t
@@ -306,3 +306,71 @@
         }
     }
 --- error_code: 200
+
+
+
+=== TEST 12: setup route (with log_labels as variables)
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, body = t('/apisix/admin/routes/1',
+                ngx.HTTP_PUT,
+                [[{
+                    "plugins": {
+                        "loki-logger": {
+                            "endpoint_addrs": ["http://127.0.0.1:3100"],
+                            "tenant_id": "tenant_1",
+                            "log_labels": {
+                                "custom_label": "$remote_addr"
+                            },
+                            "batch_max_size": 1
+                        }
+                    },
+                    "upstream": {
+                        "nodes": {
+                            "127.0.0.1:1980": 1
+                        },
+                        "type": "roundrobin"
+                    },
+                    "uri": "/hello"
+                }]]
+            )
+
+            if code >= 300 then
+                ngx.status = code
+            end
+            ngx.say(body)
+        }
+    }
+--- response_body
+passed
+
+
+
+=== TEST 13: hit route
+--- request
+GET /hello
+--- response_body
+hello world
+
+
+
+=== TEST 14: check loki log (with custom_label)
+--- config
+    location /t {
+        content_by_lua_block {
+            local cjson = require("cjson")
+            local now = ngx.now() * 1000
+            local data, err = require("lib.grafana_loki").fetch_logs_from_loki(
+                tostring(now - 3000) .. "000000", -- from
+                tostring(now) .. "000000",        -- to
+                { query = [[{custom_label="127.0.0.1"} | json]] }
+            )
+
+            assert(err == nil, "fetch logs error: " .. (err or ""))
+            assert(data.status == "success", "loki response error: " .. cjson.encode(data))
+            assert(#data.data.result > 0, "loki log empty: " .. cjson.encode(data))
+        }
+    }
+--- error_code: 200