Did you know that Zeek supports log rotation triggers, so
that you can do anything you want with a newly rotated batch of logs?
eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1b23LbxrJ9z1e4vFx1MDAxZlx1MDAxMyvA4EbkPFFcdTAwMDRFwSFAUyQlkad2pUhcdTAwMTCCXHUwMDAwXiOAXHUwMDAygVT+/azuXHUwMDAxL5JFX3Jib6Vq21x1MDAxNZOYXHUwMDE5zPT0rLW6e6T88cObN2+zYlx1MDAxZL795c3bcFx1MDAxYozn8fRhnL/9idpcdTAwMWbDhzReLdEl+DldbVx1MDAxZVx1MDAwMlx1MDAxZXmfZev0l59/XHUwMDFlr9dnh7fOgtVCvlx1MDAxOc7DRbjMUoz9Xzy/efNcdTAwMDf/e7RWvFx1MDAxOEchXHUwMDBm5ubDUrbQnrf6qyUvq1xuy1JcdTAwMTRb2GI/XCJOXHUwMDFkrJWFU3TfjedpeOihprf5dOXO7PXVtH57YX1wXHUwMDEyY63Eg8Oyd/F83suKOZuUrrCNQ1+aPaxm4U08ze5p7Wftp956WG2i+2WYpk/eWa3HQZxcdTAwMTXUpij71vEy4jlcdTAwMGUtWzy9U2v6oYXeeWdcdTAwMWS9JJdvrOarXHUwMDA3Wj57XHUwMDE4L9P1+Fx1MDAwMd4+XHUwMDE4MVx1MDAxOVx1MDAwN7NcYpYsp/tx/7q7XHUwMDFi2/qRoXm1MV1XzoSlXHRbVXTFNtWD0fdhXHUwMDFj3Wdks66dwVx1MDAwNE1VhIV/NbN2sCZk14uaXCI0U9PsfVx1MDAwNy2/dqeMgH9cdTAwMWb8/TBehC69sdzM58dOW04rpz3pmFBH81xiTIepNuvpWJ67atqKVlNNXVi2vu+fx8vZ8+nmq2D2XHUwMDAyVNJsnG1SPszxYzh9XHUwMDAyXHUwMDBmae1bo2Zqd0owmYzvarXANFx1MDAxNVtcdTAwMTPa9M5cdTAwMTK2OVXuVFW3rdBWJ6q408ZcdTAwMTNTVexAt0L9zjSn1uROWOjXp1wisKzQulx1MDAwYiaacjdcdTAwMTFKTVx1MDAwYoOpNrlTXHUwMDE11apcdTAwMWTBXHUwMDBlbFxu97yhP/tcdTAwMTPB1+rbv/nzz59e5tZDXHUwMDE4ZFx1MDAxMlsv8EuviVP80nS40jCO0Pc5evWuL+NZ5p/3XHUwMDA3fUtX1Fl3MUzenaDX/Ti43zyEr4FgmvKMYKZ1kmD/UvjPp8k1Nqa1u7uPyaVcdTAwMWX5ck+nmvKcPqphXHUwMDE5li5q+jfnz1x1MDAxZUl/7L9cdTAwMWRcdTAwMDEnXHUwMDBit1x1MDAwN1x1MDAxNTk6ZmuQvTuvX/Xet/1p9s74fWo/zou3+3F/7lB5mpxcdTAwMDJ4V7SvIOcnXHUwMDAx/sTOY2xcdTAwMWbx/3nsgHrZtn6spJ9cdTAwMDP3y7t+9eCGXG6eXHS1Zlx1MDAxOc8grptntW9cdTAwMDJyu3ama0fL7YGuaWfmR1CvWTWN1lK/NdT/TjRcdTAwMWWsWi2zXlxchlx1MDAxY/OetF6MXHUwMDE38Zw8fZiXYVxuz1x1MDAwNavl8kx9+6S9Po+jJXfC3vDhXHSas1x1MDAxODFgP2BcdTAwMTFPp8dSjtmycbxcZlx1MDAxZtwvkeDVQ1x1MDAxY8XL8bx/wlx1MDAxNuw9vNxcdTAwMDf6M3GEgDSkTtqp9VwiXHUwMDFiJUsyfeDP3lxy+tezh3V8mXYm99fG+mivu9xyPo/X6dE2KiX+KNU5athcdTAwMDFcZsf1MbiOXHUwMDFiP6bCc3yrIf39JL5fzKS+PEFcdTAwMTTP2vdvTcfpfXiC41x1MDAwN4Nf5vjfQ42KejVh2pZtXHUwMDFmhZ+DcqrKyazbRtItdF07UPm0cD4n4Vx1MDAxMzO+cVBgsL6wNc06mfCoilFTXHIkjrUv2JuEuzZIJr/+Pqi1Ui3uXHUwMDBlbP22N45cdTAwMWb/Vrx8XCIkfFx1MDAwZS4nQ4JunVx1MDAxOZapI3VcdTAwMTeaqKlcdTAwMDefS85cdTAwMTnWXHUwMDE50lx1MDAwZoqPhl7Taub/h0Ynw8RLqZD+USqkW7olXGatVvubOfB9wlx1MDAwMyqJh+w8Xk7jZfT8lXA5PdEzXHUwMDFmp1ljtVjEXHUwMDE5zPiwipfZR1xmpnnrXHUwMDBmXHUwMDBmq/w+XHUwMDFjf7RpzHyyb03TPU39XHUwMDBl395cdTAwMWOQwlx1MDAwZvvv//7p86P1z1x1MDAwZdefjFx1MDAxN183/dHoXHUwMDFmjj//UtFjqCflTUNJa1wiJflyXHRYae7jb/7Vtfdb003Xl+qH98nF9evPXHUwMDBiXHUwMDE18VHRI86EYdmKYuiGaqr6M2O+a1x0JGxd082acjDiVVVAymVX671cdTAwMWK1LlVjc3entW/fi6j+XG4rIENYp4COICCEUTO/XHUwMDFj6C9v+rVcdTAwMDPdtk/UP/aZ8s3R/nW1XHUwMDEw0lx1MDAwZlO1rNrfnfC99lpIfKNa6DPK/GItJP6WWuhkmXOUYmsnLyfo/lVcdTAwMTdfc69dXq4/qI539fuo6GT9XHUwMDBmw9ZcIlx1MDAwYnqvpmw5XHUwMDE5gsyPqr0vXHJBf7WA++JcdTAwMWFyx0nVQJlkfvMw9N1cIsWpssg44uzzsshGVWTr1pFcdTAwMTc+h8dLx0xHXHUwMDE3XHUwMDBmQfsyqYfTNOtuQzd+bWWRelazXHUwMDA0woOhXG5VKKZpPoVnzTTPkIZcYlNcdTAwMTE1S9Os2lOsmkI5s+nHXHUwMDFjhiZM9T9ZI6FSXHUwMDEzsFx1MDAxMnb8k1D631wi6cXhr6hI0k7mjpquXHUwMDBiXHUwMDFj+lfckyjm9SSM+8bVXXf9flx1MDAxOHSF01x1MDAxMttXnztaz68jX1WNpGqGJTTDUL755chcdTAwMWVWX1UkqXfToq+VWvr7+br2Lt8q4XrbeY1FknHyNlx1MDAwMIHB1lGFXHUwMDFlJSqfQ/rLu371SFf/MVWSpiuKSmH5XHUwMDFmXHUwMDE57f56laR9oyrpM9L8YpWkfbcqyTiZlpp2XHJ/9a+okkRcdTAwMTG2XHUwMDFl739r3t64m+Bq0eyV2Wzz2quk4+uA11okXHUwMDE5Nd1cdTAwMTI19ShcdTAwMGL+XHUwMDA3UPKTkDxVJqnC+OjnZfs6qaaYqoVY8eV10tVvwdVAb26MMFdTa15Y4lZfvLY6STvTVdMwNWFomqZbqvFcZqBq7Uw1XHUwMDE0S1V0w0RcZtCfwtXQa2dcbo7HXHUwMDEwKpUo9n+0UrIsVHIw5p+E0/9cdTAwMTZKL1x1MDAwZf82hdJcdTAwMGbV+2/H63Uvw8lhc1JcdTAwMWPePsZhfv7ib1LSXHUwMDFmymtZTPi3XHUwMDA008Nr3/xXXHUwMDA1fzmo11wiXoT949+o/Tl9jH7cLuZcdTAwMDfCxN/591x1MDAxN4H+8eCqLYNjNv7liVn/QzmCqf/04dJcdTAwMTej4lxcn9xsN0G5Xk9cdTAwMTZZOVx1MDAxNFx1MDAxN/mor8TjyyslcFaPbW2qTVx1MDAwYuPQ1zNcdTAwMWWDRfA4WVxcZKNbP1x1MDAxZt7486Cwj/rdKGyp6WTpmYGwZ+Pb88dRa2a7i3tlelk324VdTsTVOmihr2eUXHUwMDEz7bpcdTAwMTiK68VEe7/E3JvRbffx6uKq2dZ8vDfPaWy7X9+MLq9mbryz9SP7NK+QdnlJPfdcdTAwMWF2OV1cdTAwMDSxe3mfTVpG2Vlin1/8zmhcdTAwMWUs/fVE6LabNDdcdTAwMWX2M77p2i7P4aJ/uoYtq1x1MDAwZj136zvd2G3dz8c309XUUWLfXHQ2Xr8u/GSowVYxvrnWulx1MDAwYlvH2Nx16pHX7yqu09XaSTPHXHUwMDE44Vx1MDAxN2505CNz1LJcdTAwMTP2K/xcdTAwMWYurudj1Y4nrYtcdTAwMDSfK/hnXHUwMDFkLuzNtHWRtlx1MDAxN9d5ULg/NuJ69KF1NVx1MDAxZi09aeOCv1x1MDAwYjeuyb7Lg1x1MDAwZjtcdTAwMGLjfnJzPZsu5vNpcb5cdTAwMWXBXl7r5ort9Fx1MDAxYrCldbFcdTAwMWPd+I+Tll3A5mS0kH+xl1x1MDAxOOvPRrfvk4nYPlx1MDAwNolcdTAwMTK7JXzmkN/caLiwi1Hrupho5/dDMVdC2O819MJn31x1MDAxOVx1MDAwZoHw74PWXHUwMDAweLh/nGLMSFxcl+PWxWyiXHUwMDA18DF82ppvxlx1MDAxYTxyez7vLLn/MaB9315cdTAwMTnku3ZSf2lMMm7hP1x1MDAwMfws7Ptggf0/XHUwMDFmXHUwMDA3f1x1MDAwNFwiO9gsutuRczHDmT5+iFaR62yXXHUwMDE4P/vQe7/sNJ7aOtLeP05vzzP4bo7+dHg7n1x1MDAwM1x1MDAxZE/G4Gzi0U1cdTAwMGW/Y03VnoeXV3c3XHUwMDE390P6XHUwMDBmPlOCxcUmXHUwMDEwI2BMwVx1MDAxOPV+eokzbETbduKV1d/Ua+R5u6E8b1P8Qt96XHUwMDBlMJJcdTAwMDRrN9F/dVx1MDAxYvUn9lx1MDAwMmfA4lUxvDHKXHUwMDEx/D+Bz8muSWuwgu+3v/YkPqr38uHt1cptXHUwMDExRpTISzylnVx1MDAwNIZf5Fs/XHUwMDE5bDp9t3BbXtTuNzd+MivaXHUwMDBlfda3bkPBuKbuN/JcdTAwMDJnoHq9eubHeuklUer1YF8ywDsuMN/dYlx1MDAwZjinWYl3ynYyKDqNPPNcbj33klx1MDAwMGO8jd93dYxRsU/hXHUwMDE15yl4gDWG1FZ2XHUwMDFhuuH3u7Q++lx1MDAwM+H18i3N4TfOXHUwMDEzl+dtXHUwMDAyS3kuv7slfYc9wo/rXHUwMDE59lpibvhMJ05FvUad7Nr4jlx1MDAxN01cdTAwMWF1XHUwMDAzdmpev5nCX+DdIFx1MDAxYVx1MDAxNnXai9Z2XFxcdTAwMWFcdTAwMDM+4rPvXHUwMDE5bVx1MDAwN35wulx1MDAxMe2r05+lsEmjOcgnOFx1MDAxM0HjO85cZs/dXHL8p7fJ/rIrYFx1MDAxM+btXHUwMDE2XpyTT1x1MDAxNT8+d12nufVcdTAwMGW2l/DzznbVJ7+QrWUzXCJd88qZLn1X1zo9+KWhXHUwMDE0sKFEv4r2ovJXXCL96paeM8BecVx1MDAwZT1d98phSv7HWVx1MDAxOS77Nir9OOc++G7nY1x1MDAwNf7MvLJcdPuhS7DXi3XgXG5n5lxmYbOruU5Q8DmXg9RPPIxrXG7oXHUwMDE13lxy1Fx1MDAwZeEzXHUwMDE5Ylx1MDAwZlizgffKmUZn5tFcdTAwMWEl+5PwS7ZcdTAwMTVcdTAwMWX7drj1S1x1MDAxN3ZJf0o7Z4Y8+0hxW1x1MDAxMfBXx/joeL/Qkoj2XCJoj1x1MDAxMovAldM0pFx1MDAwZlx1MDAwNluPzrqnXHUwMDBiz5lh3Fx1MDAxMJibXHUwMDE1ZGNcdTAwMDd6izE63st9nD350e+xj3XyMfZa+lx0zY1zTFwiw3WAxaSrSs65eqdH71x1MDAwNFuP8EV9XHUwMDBl5qO9Y2/Yr+r3gfWYMDEkPFx1MDAwMdewgdpKYKxsKmQr7FLAVeKEhvH0LNiX4KGfwIaGxKBP8zRcdTAwMTizhl9cdTAwMDY0L/jRZX54XHUwMDBl+IH1cU6lPEtcdTAwMTeanMNP3lx1MDAxNudcdTAwMGZMzeisRKc/IDvwXHUwMDFk2uBcdTAwMDDX5Vxm+J3Jc1x1MDAwMEaB1cKVeqLj/MhcdTAwMDZcdTAwMDXjdlx1MDAxYywxJ3FQIy7TvnwnUtvsx6Yu+T5kf3n0Xlx1MDAxMkXs69LVge9sx/l+gzlcdTAwMDSfXGZKrIk4ijN2XHUwMDA2UZfOXz5rnT78XHUwMDEy54VfYt0yKMFcdKxcdTAwMTHliJEpNFx1MDAwMftcblR5XpGg+av3sCf2n+Y5Qe5cdTAwMTXV+4TvSpP8/rB6v6tLTlxySVx1MDAxYjCuSTpUtVxy2DaP2pNcdTAwMDBn2lV5fcdVvFx1MDAwNFqRXGZVxlkzjzpOhPZIkFx1MDAxNnYofpdcdTAwMDOjOlP4XHUwMDFhWsi+XHUwMDFj5vBcdTAwMTdpIfZcdTAwMTWkXHUwMDEym8CH1MKtXHUwMDFjQ1x1MDAxYUV+aSpcdTAwMWTmqG54hIVCVzFnwWeLM2aM9T1cdTAwMTW+YS1knkq/a4y1XHUwMDEy9sB22Ev9JXzG2KVzYrtcdTAwMTBXPcdLWTucukZcdTAwMWPAO6XUkObWJ1x1MDAxYyRcdTAwMDOddIDigNdcdTAwMGaicaOuw44t8Vx1MDAxMdjJOjRfWSdcdTAwMWUjxsA/PdZcdTAwMTfWRTxLTXFcXEO2XHJcdTAwMTSv7O75LHlcdTAwMDRfMOdcdTAwMDJod51jXHUwMDE3r1x1MDAxN+s65ibeXHUwMDE0wGVKWslcdTAwMWFJazgu+XKnkSvsL2dtXHUwMDAwNlx1MDAxObukf1xy4mCdztEgTGKfXHUwMDA2P4NcdTAwMGLyuau5l8Oo2rvutnJoXHTtxVx1MDAxNVLP61x1MDAxY8ewV6zPOkmaQ76WulTsn1mLOlx1MDAwN99cdTAwMTP3XHUwMDE4i1x1MDAxOLPTR9KZinO0b6mRwGS200hfcrlcdTAwMWFLeumJzo6bRf5UI+n8oZGkozQ/7E532rjT7k4vl5/gM+JcdTAwMTi9T+ev7PaJPdOYXHUwMDAyuCswl+C9koaAu7z/ftNATCS8bimPYL3pc0ym2IyzblJcXCswXp6jXHUwMDEzXHUwMDE1zH2H9I/tQiyFzjislVJzJSeftu1iaoP7XHUwMDE1xNZC4i8gfnGMXHUwMDA0T1x1MDAwYtZhssFcdFTimtevYr4zgI9mXHUwMDA1aeWw4PlIP0vJI+hCXHUwMDE5VblcYucomdTReiH3XHUwMDAxXeD4QjGA+lx0OzPYOKt4SXpJ8YW0grDMmkrcJM6zdlx1MDAxZtpIV92iQ+snrO9cdTAwMWPjOHdhXY1cZnB5XHUwMDE341xuztFcdTAwMTC7SEvAOU3iuatQ/rPjdZXjwD91w29UeiDjkcH2JjPiXHUwMDA3zn8mMeNcZoGRrsHxhvWkucutXHUwMDEwXHUwMDEzma86csFcdTAwMWN+0PBJMW3LeZEjOSB5gXPvMYdyXHUwMDE5r1x0J/xcXFDugU/W8kpcdTAwMGbS6rOQ3FxuXHUwMDE0nqM/QJ5B73iGx/mVqyNeXHUwMDEwvoCXXHUwMDE5xSrkpvy8pVx1MDAxOOxcdTAwMTPuysH2KCejXHUwMDE4rFx1MDAxMlbbffhcdTAwMDb5XCJs2dlcXCBcdTAwMWYup5fzlGqb0WKeTpxVXHUwMDAyXGblQ2h7R4zWk1aeXHUwMDFk6ofVdtdcdTAwMTYsr/HOejNcdTAwMTGGifrjsaP5yKvth6ptjnm5lkG9oIxcdTAwMWRap/Zy3jtTXCLsh7BcdTAwMDKO5NjDXHUwMDAwfpspbjOKoFx1MDAxYqTtgnlGXFxKXCLKX1x1MDAxMVx1MDAxYptcdTAwMWMzJc9IQzxcdTAwMDVnWlZ+Vp49055cdTAwMGLSJ8pJKa7veV/KXHUwMDE4XHUwMDBm7JPfSCMyn3hV7p5cdIfwO8fcmeREoVx1MDAxYlx1MDAxZM5reWwpMb+bK+A43+bck23IJVx1MDAxNuu5tMdTjvo0xi3lhZhcdTAwMDexkLRF9UgvgFPmJcWPJMop7/YoZ0TeO5Q6RVx1MDAxOJS8KlG7cp7HeyWelFx1MDAxNKtl7lLX5XrIvVH3SkxcdTAwMTBXmkf5Iccy0mbmXHUwMDE37Vx1MDAxYrmkjFxy0GKMXHUwMDExXHUwMDE0XHUwMDAzKc9cdTAwMWFTXHUwMDBlX0o9q/R854vdXvbz7Xwj9+ZRPKSch7lT+Svd7XvvN47z2M/3waRyXHUwMDEyk1x1MDAwYsLkXHUwMDEw+0ZccuBQbKFcXIF9tvMz8m5obVx1MDAwMlx1MDAxZiQzin/It2g8a4vA+WiMqWQosVxmXGZcdTAwMTHXPao3nEFcdTAwMTWfZe5PuuE6Q8qPOZfbv3O5iiY9zEU6XuQ6a0+fsZtBmzBmSDGCOE3aq8taYsb6h3PWKbdFLFx1MDAwNEZcIlrP2MVnqjtkvoK1XHUwMDE4I1x1MDAwMeU+NKagXHUwMDE4SnlcdTAwMTd0XHUwMDFl2sa5iVwitZrn0Fx1MDAxMS+AScrB4Vx1MDAwN6xccm2nXHUwMDE4j1x1MDAxY6C5rXQ9XCL7wU/OXHUwMDFiOSagzpRcdTAwMWNlXHUwMDBlXHUwMDE0nE9xTfbkWZWfxMsu13VcdTAwMTLTQ6pxtaov61x1MDAxMH7iw7PUvqHkYmPHXHTKmWdCxm7iWb5cdTAwMWJHsatkLJOvJFx1MDAwNikvLblcdTAwMGXg3M0tOfcjXHUwMDFm90mHhlTDwC9Uq3C9TP30PtWNdDY4Z8pbu5y3UZtPZ1/kgmJcdTAwMDPqKMqnSsZPwjG12jfhIKriXHUwMDA06Vx1MDAwZmn+7pl5VzJf+Cy8bWUj1Z4pnY8na1x1MDAwMuRlfFx1MDAxN3Fo+z68XHUwMDExn+RNSVhGXHUwMDBlXHUwMDExU97OsXdbaVx1MDAwNdeSXlx1MDAxOVx1MDAxMGawP3fHXHTyWU65XHUwMDFjfIk+wvWeS4iXiLFcdTAwMGVrjCprf9bbqjZcdTAwMDQ/0N/htt0756bbglx1MDAxZFx01YyUf9K9Tlx1MDAxNZuhxbRcdTAwMTbVX4SZXHUwMDBl15NRwXdcdTAwMWSU0znBgU/xjlx1MDAwYrNoXHUwMDFh7/PJnW6qtFx1MDAxZsqHqC4gXHUwMDBlU97dYc6Bf1x1MDAwZek217JHbZ7MkVhcdTAwMDOQR0NcdTAwMDOAgy3X2P1cdTAwMDH6yf5uwbVcdTAwMTFpi0P1P+VNwEz1yXdcIkkgmCNPnlx1MDAwN/xZaWyFdcaVIfFcdTAwMTRcdTAwMTBcdTAwMWZ05mjvOX/cT/Jnl1/xeJ6TY8KWOSHjzG5fXHUwMDE59Fx1MDAxMJziu1xm1e+xf55wXG68Rn+wlbo15FpcdTAwMTN7o9ojZ86RdpTQR2dIMcvgO1x05tyg4LuWat+sPVx1MDAxY3vAfY7X7v6Z4jdwR/qmkO89vs8hXHUwMDFiqbbOdeZMn+xcdTAwMGXIXHUwMDFmXHUwMDA2aWvVXHUwMDE2u5e+XHUwMDEy3mzpXnExvtmmnVx1MDAxODlr/zyGXHUwMDFlW8ynhrq//+wkzV1bMcU7nYXxOFmu58GiZlx1MDAwNdpVMVx1MDAxMZlsW1xm4upukHlC67TL6t6wQXfB5/dT7JPvfXt1qvv4fKCpOcdcdTAwMTG2lbBB51xmrFJe2+NcdTAwMThD90dVfCDf4Fx1MDAxY2PWU32X23icw7C2XG7ORVhbd/lcdTAwMDLOtorx8q5sqFx1MDAxZj1cdTAwMTeyvy7v1TiO1KVOMS74flDm3fG55zoz4uaW6i1geUt3XHUwMDAwyJ2AR8qxgTHEXHUwMDA1mXN1XHUwMDE5k5W2o56j3NTj+8tcdTAwMGXpW+PwXFzdaUmeNpgjaYXp4lxiy/I91E3XMbjPNU+05yjnPVhbYoRjId0jbIFlnWNDsX9f7O89sWdej7SKc1x1MDAxONSBe23evU97o7taT/N7fJ8n73WKXFzhXHUwMDFhLKE4OOBavX2IxVpVXHUwMDE3lsyV6q7PZc7xvraoXHI4V2vv/NOXNVx031OyXHLNVOooxWz5LPGOOlx1MDAwZdzf1Vx1MDAwMlWc3+Vb2+o8KUdh/tDPToBRY9JcdTAwMWFAszlcdTAwMDaYLjTMa7nQ4Yyx376x6WdI6+nlzPR2bbfv1Vx03a8v7E24uC4mZYZ48/5xLGTbaP8zXHUwMDE5xnThNar7fMJ5w17Ku/38cVx1MDAwNPx/kD/X+fHo93BcdTAwMWXC/Y+Ga/R/flx1MDAxOIYwVHP/g8g/f/jz/1x1MDAwMOdY5CEifQ==conn.1 conn.2 conn.3
This blog post shows you how to use Zeek's native log rotation feature to
conveniently invoke any post-processor, such as a log shipper. In our examples
we show how to to ingest data into Tenzir, but you can plug in any downstream
tooling.
External Log Shipping (pull) In case you're not using Zeek's native log rotation trigger, you may observe a
directory to which Zeek periodically writes files. For example, the utility
zeek-archiver does that.
Generic log shippers can take care of that as well. Your mileage may vary. For
example, Filebeat works for stock Zeek only. The parsing logic is
hard-coded for every log type. If you have custom scripts or extend some logs,
you're left alone. Filebeat also uses the stock Zeek JSON output, which has no
type information. Filebeat then brings the typing back manually later as it
converts the logs to the Elastic Common Schema (ECS).
Native Log Shipping (push) There's also a lesser known, push-based option using Zeek's logging
framework . You can
provide a shell script that Zeek invokes whenever it rotates a file . The shell
script receives the filename of the rotated file plus some additional metadata
as arguments.
First, to activate log rotation, you need to set
Log::default_rotation_interval
to a non-zero value. The default of 0 secs
means that log rotation is disabled.
Second, to customize what's happening on rotation you can redefine
Log::default_rotation_postprocessor_cmd
to point to a shell script.
For example, to rotate all log files every 10 minutes with a custom ingest
script, you can invoke Zeek as follows:
zeek -r trace.pcap \
Log::default_rotation_postprocessor_cmd=ingest \
Log::default_rotation_interval=10mins
Let's take a look at this ingest
shell script in more detail. Zeek always
passes 6 arguments to the post-processing script:
The filename of the log, e.g., /path/to/conn.log
The type of the log (aka. path
), such as conn
or http
Timestamp when Zeek opened the log file Timestamp when Zeek closed (= rotated) the log file A flag that is true when rotation occurred due to Zeek terminating The format of the log, which is either ascii
(=
zeek-tsv
) or json
Here's a complete example that uses (1), (2), and (6):
ingest #!/bin/sh
file_name = " $1 "
base_name = " $2 "
from = " $3 "
to = " $4 "
terminating = " $5 "
writer = " $6 "
if [ " $writer " = "ascii" ]; then
format = "zeek-tsv"
elif [ " $writer " = "json" ]; then
format = "json --schema zeek. $base_name "
else
echo "unsupported Zeek writer: $writer "
exit 1
fi
pipeline = "from file $file_name read $format | import"
tenzir " $pipeline "
Post-processing with Tenzir pipelines When you run Zeek as above, the ingest
script dynamically constructs an
ingestion pipeline based on the type of the Zeek log at hand. Given your logging
format (TSV or JSON), the pipelines for a rotated conn.log
file may look like
this:
from file /path/to/conn.log read zeek-tsv | import from file /path/to/conn.log read json --schema zeek.conn | import
This pipeline reads the Zeek log and pipes it to the import
operator, which
stores all your logs at a running Tenzir node. You could also use the extend
operator to include the filename in the data:
pipeline = "from file $file_name read $format \
| extend filename= $file_name \
| import"
Zeek package If you want post-processing with Tenzir pipelines out of the box, use our
official Zeek package :
zkg install zeek-tenzir
After installing the package, you have two options to run pipelines on rotated
Zeek logs:
Load the tenzir-import
Zeek script to ship logs to a local Tenzir node
# Start a node.
tenzir-node
# Ship logs to it and delete the original files.
zeek -r trace.pcap tenzir/import
Pass Tenzir::delete_after_postprocesing=F
to zeek
to keep the original
logs.
Write Zeek scripts to register pipelines manually:
# Activate log rotation by setting a non-zero value.
redef Log::default_rotation_interval = 10 mins;
event zeek_init()
{
Tenzir::postprocess("import");
Tenzir::postprocess("to directory /tmp/logs write parquet");
}
The above Zeek script hooks up two pipelines via the function
Tenzir::postprocess
. Each pipeline executes upon log rotation and receives
the Zeek log file as input. The first imports all data via import
and the
second writes the logs as parquet
files using to
.
Reliability Zeek implements the log rotation logic by spawning a separate child process.
When the (parent) Zeek process dies, the children become orphaned and keep
running until completion.
The implication is that Zeek cannot re-trigger a failed post-processing command.
So you have exactly one shot. This may not be a problem for trace file analysis,
but live deployments may require higher reliability guarantees. For such
scenarios, we recommend to use the post-processing script as a notifier, e.g.,
to signal another tool that it can now process a file.
For ultimate control over logging, you can always develop your own writer
plugin that immediately ship logs
instead of going through the file system.
Conclusion This blog post shows how you can use Zeek's native log rotation feature to
invoke an arbitrary command as soon as a log file gets rotated. This approach
provides an attractive alternative that turns pull-based file monitoring into
more flexible push-based delivery.
Push Pull Trigger rotation new file/dir Complexity low medium Reliability low high
If you are looking for an efficient way to get your Zeek logs flowing, give
Tenzir a try . Our Zeek
package makes it easy to launch
post-processing pipelines natively from Zeek. And don't forget to check out our
other Zeek blogs .