Sam Reinhart and Evander Kane scored for the Sabres (5-12-4), who lost their sixth straight game. Robin Lehner made 29 saves for Buffalo, which cut it to 3-2 with 3:32 left on Kane's 12th goal of the season.
The Sabres nearly tied it, 3-3, with 1:46 left in the third, but a potential power-play goal was ruled no-goal on the ice and upheld by video review. Kyle Okposo got off a shot off a rebound, during a big goal-mouth scramble, but the puck disappeared from sight and the play was blown dead.
"Yeah, it's no goal," Blue Jackets coach John Tortorella said. "And if they call it a goal, it's goalie interference. And the whistle blew already anyway, when the puck went over. We didn't think it was going to be a goal."
Dubois' goal in the second was his third of the season, giving the Blue Jackets a 1-0 lead at 4:14 of the period. It also was the lone goal scored in the game through the first 40 minutes, which is something that's becoming a trend for Columbus.
The Blue Jackets led1-0 starting the third period for the fourth straight game, and have scored the first goal of a game in five straight.
Panarin, as he did Friday in a 2-0 win against the New York Rangers, made it 2-0 in the third with his second goal in as many games - his first goal streak as a Blue Jacket. Jenner pushed it to 3-0, but the Sabres struck back 13 seconds later to cut it to 3-1 on Reinhart's goal.
Video: CBJ@BUF: Panarin rings a wrist shot in off the iron
Here's how the rest of it went down:
(Corsi, scoring chance data per naturalstattrick.com)
Goals: CBJ - None; BUF - None
Shots: Blue Jackets 12, Sabres 7
Shot-Attempts percentage (Corsi 5v5): Blue Jackets 55.6% (15-12), Sabres 44.4% (12-15)
Scoring chances 5v5: Blue Jackets 4, Sabres 2
High-Danger chances 5v5: Sabres 2, Blue Jackets 1
11:43 - It took the Blue Jackets about half the period to get into their game, but once they did it was apparent - especially during this shift for the second line of Panarin, Dubois and Josh Anderson.
The trio got the puck into the Sabres' zone and held it there for nearly their entire shift. They put four shots on goal and defenseman Markus Nutivaara missed the net with another one. Lehner had to work, but was up to the task.
QUOTE: "After the first seven or eight minutes of the first period, that's when we started our forecheck and playing under the hash. Did some really good things there." - Tortorella
14:47 - Buffalo defenseman Marco Scandella launched a hard slap shot along the ice, but Oliver Bjorkstrand blocked it. The puck bounced out of the Columbus zone and wound up a few seconds later in Buffalo's end of the ice. That was important, because it was frozen there, which caused a face-off that led to Sabres center Jack Eichel being penalized for a face-off violation. Eichel was only penalized for this one, but was thrown out of the face-off circle four more times.
15:13 - The Blue Jackets got the first power play of the game, after Eichel's transgression. They didn't score off it, nor did they get a shot on goal. They did spend most of the time set up in the Sabres' zone and had six shot attempts. Three were blocked and three missed, including a slap shot that Panarin rung off the right post with 3:31 left in the period.
Goals: CBJ - Pierre-Luc Dubois (Oliver Bjorkstrand, Markus Nutivaara); BUF - None;
Shots: Blue Jackets 12, Sabres 10
Shot-Attempts percentage (Corsi 5v5): Blue Jackets 64.3% (18-10), Sabres 35.7% (10-18)
Scoring chances 5v5: Sabres 6, Blue Jackets 5
High-Danger chances 5v5: Sabres 1, Blue Jackets 1
4:14 - GOAL - The game's first goal was the result of a nice play all-around by the Blue Jackets. It started with a shot from the right point by Nutivaara, which caused Lehner to make a save with traffic around him. The puck skittered behind the net, where Bjorkstrand collected it.
Video: CBJ@BUF: Dubois buries a loose puck over Lehner
He made a quick, smart decision to throw the puck back to the front of the net, where it hit Lehner's leg and bounced free in front of the crease. Dubois swatted it home for his third goal of the season.
SCORE: Blue Jackets 1, Sabres 0
4:38 - Savard was sent to the penalty box for hooking Eichel, which gave the Sabres their first power play. Prior to the game, Tortorella said he wanted to see Savard bring his play up to its usual standards. Up until this point, and for most of the game, he got that done.
Regardless, the Sabres went on the man-advantage. They didn't score, and got just one shot through to Bobrovsky, who stopped it.
15:30 - Columbus went back on the penalty kill after Josh Anderson was called for hooking Buffalo's top center, Ryan O'Reilly. The Sabres applied better pressure on the Blue Jackets' net during the man-advantage, but Bobrovsky made saves on all three shots. He did leave one big rebound after a shot by Eichel, but the Blue Jackets swarmed to the puck and didn't allowed a second scoring chance to develop.
16:14 - Less than a minute after the power play began, Scandella turned the puck over in the Columbus zone and it turned into a shorthanded breakaway for Cam Atkinson the other way. His wrist shot was stopped by Lehner, who just got his glove on it. The puck skipped off the glove, hit the right post and bounced away. The game remained 1-0.
Goals: CBJ - Artemi Panarin (Markus Nutivaara), 5:47, Boone Jenner (Cam Atkinson), 9:24; BUF - Sam Reinhart (Victor Antipin, Ryan O'Reilly), 9:37, Evander Kane (Eichel, Scandella), 16:28
Shots: Sabres 15, Blue Jackets 5,
Shot-Attempts percentage (Corsi 5v5): Sabres 69% (20-9), Blue Jackets 31% (9-20)
Scoring chances 5v5: Blue Jackets 7, Sabres 4
High-Danger chances 5v5: Blue Jackets 3, Sabres 1
Overall Corsi: Blue Jackets 50% (42-42), Sabres 50% (42-42)
Overall 5v5 Scoring chances: Sabres 16, Blue Jackets 12
Overall High-Danger chances: Blue Jackets 5, Sabres 4
5:47 - GOAL - It was Panarin time. When Panarin has it going, there are few in the NHL who can mesmerize like him. This time he mesmerized the fans by turning Scandella inside out in the slot with a hesitation move to get himself free for a shot. His wrister to the far side hit both posts and fell into the net to make it 2-0.
Video: CBJ@BUF: Jenner bangs home a loose puck in front
QUOTE: "He's got that ability. He can make that happen, and he's got a great release. I think he caught [Lehner] off-guard there. Just a great shot and great play by him. It was a big goal for us at the time." - Boone Jenner on Panarin's goal.
SCORE: Blue Jackets 2, Sabres 0
9:24 - GOAL - Jenner did what Jenner does best. He got to the front of the net, received a pass from Brandon Dubinsky and scored his third goal of the season with Lehner out of position. Columbus had more than two goals in a game for the first time since losing 5-3 to the New York Rangers on Nov. 6 at Madison Square Garden.
SCORE: Blue Jackets 3, Sabres 0
9:37 - GOAL - The Sabres got one back on the next shift, just 13 seconds later. Sam Reinhart got credit for the goal, which was the first one Bobrovsky allowed since Paul Byron scored at 12:14 of the third period in the Jackets' 2-1 overtime win Nov. 14 in Montreal.
SCORE: Blue Jackets 3, Sabres 1
16:28 - GOAL - All of a sudden, it became a game again. Kane scored his team-high 12th goal of the season to bring the Sabres within a goal, 3-2. It also set up a wild finish, which included a controversial non-goal call during a late Sabres power play.
QUOTE: "After the third goal, it's just a natural thing. We didn't have the puck enough, and they're taking chances because they're down. So, both things couples together, that's where we got backed off a little bit." - Blue Jackets coach John Tortorella
SCORE: Blue Jackets 3, Sabres 2
18:05 - Seth Jones was sent to the penalty box for holding Kane, which gave Buffalo the man-advantage and even more momentum. It led to the controversial play, in which it appeared Okposo might've scored during a goal-mouth scramble that ended with most of the players on the ice piled up in the Jackets' net. The call on the ice was no goal, and a video review upheld it, much to the behest of Sabres fans. The Jackets hung on from there.
QUOTE: "You never know what they see with the camera angles that they have. It's tough. We were looking up at the Jumbotron. It was definitely close, but I think the whistle [had] blown." - Jenner on the reviewed play.
(All times ET)
Blue Jackets: Host the Calgary Flames on Wednesday (7 p.m., FS-O, Fox Sports Go; Radio: 97.1 FM, BlueJackets.com; SN360, NHL.TV)
Sabres: Host the Minnesota Wild on Wednesday (7 p.m., TV: MSG-B, FS-N, NHL.TV)